2013-10-14 21 views
2

在RenderToTexture上下文中,涉及多个着色器,我需要CPU访问其中一个最终呈现目标。使用glGetTexImage很好,不幸的是它将所有纹理数据复制到客户端内存。RTT到TEXTURE_BUFFER

为了避免这个副本,我试图用TEXTURE_BUFFER到implemnet一个RTT,因此单独的缓冲区对象连接到一个纹理,使用纹理渲染的部分,然后简单地使用glMapBuffer映射纹理的数据存储并使其可供CPU访问。

除了代码之外,我想问一下这样的策略是否可能是正确的(没有什么比我更好的了)或者违背了任何规范。

我有很多关于TBO的文档作为设置纹理的方法,但没有关于使用TBOs读取RTT的结果。我只是想知道,我想要做什么是不合法的。

+0

为什么需要将内容下载到系统内存?也许你可以在GPU上完成这项工作?映射缓冲区通常也会复制。 https://www.opengl.org/wiki/Buffer_Object#Mapping – fen

+0

Im实际上试图避免复制到系统内存。映射缓冲区对象通常可以解决而不涉及任何复制。不,不能在GPU上工作 – user815129

+0

你也可以看看像素缓冲区对象http://www.songho.ca/opengl/gl_pbo.html,https://www.opengl.org/wiki/Pixel_Buffer_Object – fen

回答

1

不幸的是,这种方法是行不通的。 A buffer texture不是真正的可用作渲染目标或用于2D纹理过滤的纯粹2D纹理,如this related question/answer pair中所述。它实际上只是一个缓冲区的数据,可以通过一个着色器作为线性一维整数索引数组(伪装成一种特殊的纹理),因此与普通的过滤2D纹理没有多大关系。它与OpenGL 4稍后作为shader storage buffer(但是以更加麻烦且只读的方式在GL 3硬件上提供)或uniform buffer object(但具有更大的尺寸并使用不同的存储区域)相比更加相似, 。所以不,你不能在FBO中使用TBO作为渲染目标。

什么可能是你的选择将是pixel buffer object (PBO)。虽然这仍然会将纹理内存复制到额外的缓冲区中,但如果正确使用,您仍然可以从异步读取,特殊的主机可访问的内存等等中获益。

+0

谢谢。经过更深入的考虑后,我决定首先由Fen提出建议,并修改渲染管道,以最大限度地实现异步操作。 – user815129