在RenderToTexture上下文中,涉及多个着色器,我需要CPU访问其中一个最终渲染目标。使用glGetTexImage
效果很好,不幸的是它将所有纹理数据复制到客户端内存。
为了避免这个副本,我试图使用TEXTURE_BUFFER
实现RTT,因此将一个单独的Buffer Object附加到纹理,使用该纹理作为渲染的一部分,然后简单地使用{{ 1}}映射纹理的数据存储区并使其可供CPU访问。
除了代码之外,我想问一下这样的策略是否正确(没有什么比这更好的了)或者是否违反任何规范。
我有大量关于TBO的文档作为设置纹理的方法,但没有关于使用TBO来读取RTT结果的文档。我只是想知道我想要做的事情是不合法的。
答案 0 :(得分:1)
不幸的是这种方法不起作用。 buffer texture实际上不是一个可用作渲染目标或2D纹理过滤的二维2D纹理,如this related question/answer pair中所述。它实际上只是一个缓冲区的数据,可以作为线性1D整数索引数组(伪装成一种特殊的纹理)访问着色器,因此与普通的滤波2D没有太大关系质地。它与后来作为shader storage buffer引入的OpenGL 4更相似(但是以更加繁琐和只读的方式,但在GL 3硬件上可用)或uniform buffer object(但是更大)大小和使用不同的内存区域)。所以不,你不能在TBO中使用TBO作为渲染目标。
您可以选择pixel buffer object (PBO)。虽然这仍然需要从纹理内存复制到附加缓冲区,但如果正确使用,您仍然可以从异步读取,特殊主机可访问内存等内容中获益。