在一个RenderToTexture上下文中,涉及几个着色器,我需要CPU访问最终的渲染目标之一。使用glGetTexImage很好,不幸的是它将所有纹理数据复制到客户端内存中。
为了避免这种复制,我尝试使用TEXTURE_BUFFER实现RTT,从而将一个单独的缓冲区对象附加到纹理,使用该纹理作为呈现的一部分,然后使用glMapBuffer映射纹理的数据存储并使其可供CPU访问。
除了代码之外,我想问的是这样的策略是否正确(在我的脑海中没有比这更好的),或者它是否违背了任何规范。
我有很多关于TBO作为设置纹理的方法的文档,但是没有关于使用TBO来读取RTT结果的文档。我只是想知道,我想做的事在任何方面都是不合法的。
发布于 2013-10-14 13:46:14
不幸的是,这种方法行不通。缓冲纹理实际上不是一个可以用作渲染目标或2D纹理过滤的开放的2D纹理,如这个相关的问题/答案对中所描述的那样。它实际上只是一个缓冲区的数据,可以作为一个线性一维整数索引数组(伪装成一种特殊的纹理)被着色器访问,因此与普通过滤后的2D纹理没有多大关系。它与OpenGL 4后来引入的阴影存储缓冲器 (但以一种更繁琐、更只读的方式,但在GL 3硬件上可用)或均匀缓冲对象 (但具有更大的大小和使用不同的内存区域)更相似。因此,不能使用TBO作为FBO中的渲染目标。
对于您来说,可能的选择是一个像素缓冲对象(PBO)。虽然这仍然需要从纹理内存复制到一个额外的缓冲区,如果使用得当,您仍然可以从异步读取、特殊主机访问内存之类的东西中获益。
https://stackoverflow.com/questions/19359898
复制相似问题