2

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

为了避免这种复制,我尝试使用 a 实现 RTT TEXTURE_BUFFER,因此将单独的缓冲区对象附加到纹理,使用该纹理作为渲染的一部分,然后简单地使用glMapBuffer映射纹理的数据存储并使其可访问中央处理器。

除了代码,我想问一下这样的策略是否正确(没有比我更好的想法了)或者它是否违反了任何规范。

我有大量关于 TBO 作为设置纹理的方法的文档,但没有关于使用 TBO 读取 RTT 结果的文档。我只是想知道我正在尝试做的事情是否不合法。

4

1 回答 1

1

不幸的是,这种方法行不通。缓冲纹理并不是真正的普通 2D 纹理,可用作渲染目标或用于 2D 纹理过滤,如相关问答对中所述。它实际上只是一个缓冲区的数据,着色器可以将其作为线性 1D 整数索引数组(伪装成一种特殊的纹理)访问,因此与普通过滤的 2D 纹理没有太大关系。它更类似于后来 OpenGL 4 引入的着色器存储缓冲区(但以更繁琐和只读的方式,但在 GL 3 硬件上可用)或统一缓冲区对象(但具有更大的尺寸并使用不同的内存区域)。所以不,您不能将 TBO 用作 FBO 中的渲染目标。

您可能会选择像素缓冲区对象 (PBO)。虽然这仍然涉及从纹理内存复制到额外的缓冲区,但如果使用得当,您仍然可以从异步读取、特殊主机可访问内存等内容中获益。

于 2013-10-14T13:46:14.307 回答