是否可以从CUDA内核直接写入OpenGL默认BackBuffer的ColorAttachment(GL_BACK)?因此,我可以直接在内核中访问缓冲区,而不是将数据复制回CPU,然后发送回设备以渲染为纹理?谢谢!
BackBuffer
ColorAttachment(GL_BACK)
guykilcj1#
最好的办法是从CUDA内核写入缓冲区/纹理(就像@BDL在他的评论中建议的那样),然后在帧缓冲区上将该纹理渲染为四边形。以可移植的方式直接写入彩色帧缓冲区可能是不可能的,因为出于性能原因,每个GPU可以使用不同的设置来表示存储在帧缓冲区中的图像(颜色编码格式、数据布局)。您可能可以将纹理直接写入或blit到某些GPU上的帧缓冲区,但这可能会迫使OpenGL使用非最佳的图像布局。我认为从CUDA写入到OpenGL缓冲区/纹理,然后将该纹理渲染到全屏四边形可能是最快的方法,因为您可以避免将图像复制到CPU并返回到GPU(这是这种情况下的瓶颈)。谢谢!纹理是最快的方法吗?PBO或RenderBuffer怎么样?纹理将是最快的方式,因为你可以采样quads的像素非常快,由于如何GPU存储纹理在内存中。我认为CUDA有一些功能来读写纹理。对于“...”,所有的设置包括(颜色编码格式,数据布局)不是由开发人员在代码中设置的吗?如果它能够设置它们和CUDA的格式并使它们相同,如果可能的话,直接到GL_BACK会更快吗?在OpenGL中,你不能(据我所知)选择纹理的特定内存布局(不确定颜色格式)。当你创建一个纹理时,数据被上传到GPU,然后OpenGL(或驱动程序)使用最快的纹理格式(这就是为什么你不能读取纹理作为缓冲区,你必须使用imageLoad/imageStore)。如果你设法手动选择backbuffer的颜色格式和内存布局,那么你可能能够将图像(你需要存储在缓冲区中以获得可预测的内存布局)直接blit到backbuffer。操作将类似于:
这也意味着你不会有一个可移植的程序,因为某些GPU可能不支持特定的格式,或者它可能不是最佳的。我用Vulkan API做了类似的事情,我必须启用扩展,并在支持直接写入backbuffer的格式之间手动选择颜色格式和内存布局。
1条答案
按热度按时间guykilcj1#
最好的办法是从CUDA内核写入缓冲区/纹理(就像@BDL在他的评论中建议的那样),然后在帧缓冲区上将该纹理渲染为四边形。
以可移植的方式直接写入彩色帧缓冲区可能是不可能的,因为出于性能原因,每个GPU可以使用不同的设置来表示存储在帧缓冲区中的图像(颜色编码格式、数据布局)。
您可能可以将纹理直接写入或blit到某些GPU上的帧缓冲区,但这可能会迫使OpenGL使用非最佳的图像布局。
我认为从CUDA写入到OpenGL缓冲区/纹理,然后将该纹理渲染到全屏四边形可能是最快的方法,因为您可以避免将图像复制到CPU并返回到GPU(这是这种情况下的瓶颈)。
谢谢!纹理是最快的方法吗?PBO或RenderBuffer怎么样?
纹理将是最快的方式,因为你可以采样quads的像素非常快,由于如何GPU存储纹理在内存中。我认为CUDA有一些功能来读写纹理。
对于“...”,所有的设置包括(颜色编码格式,数据布局)不是由开发人员在代码中设置的吗?如果它能够设置它们和CUDA的格式并使它们相同,如果可能的话,直接到GL_BACK会更快吗?
在OpenGL中,你不能(据我所知)选择纹理的特定内存布局(不确定颜色格式)。当你创建一个纹理时,数据被上传到GPU,然后OpenGL(或驱动程序)使用最快的纹理格式(这就是为什么你不能读取纹理作为缓冲区,你必须使用imageLoad/imageStore)。
如果你设法手动选择backbuffer的颜色格式和内存布局,那么你可能能够将图像(你需要存储在缓冲区中以获得可预测的内存布局)直接blit到backbuffer。
操作将类似于:
这也意味着你不会有一个可移植的程序,因为某些GPU可能不支持特定的格式,或者它可能不是最佳的。
我用Vulkan API做了类似的事情,我必须启用扩展,并在支持直接写入backbuffer的格式之间手动选择颜色格式和内存布局。