【发布时间】:2014-11-25 23:51:14
【问题描述】:
场景是: 我有一个纹理 A。 有3个循环。每个循环将一个通道写入纹理 A。 3 次循环后,A 中的 3 个通道全部更新。
着色器是这样的:
vec3 tmpVec3 = texture(inputTexture0, vUV).rgb; // inputTexture0 is texture A tmpVec3[channelIndex_P] = texture(inputTexture1, vUV).r; // write one channel from inputTexture1
color = vec4(tmpVec3, 1.0);
它渲染到纹理A,即inputTexture0。 这样通过渲染和采样同一个纹理,我可以通过一个纹理节省内存。
但是,结果并不理想。
我阅读了文章“Sampling and Rendering to the Same Texture”。 它说:
“这意味着它可以做你想做的事,采样器可能会获取旧数据, 采样器可能会得到一半旧数据和一半新数据,或者它可能会得到垃圾 数据。这些都是可能的结果。”
但是由于特定像素的写入数据总是在获取特定像素的数据之后发生,为什么不可能呢?
另一篇文章“Sampling from and rendering to the same texture and parallel sorting / hashing” 它说:
"但是如果每个帧缓冲区像素中的结果都是 写入该像素的片段之一,而不是组合 来自多个片段的值,这个功能仍然是 对于在 glsl 中实现的并行排序/散列算法很有用。”
我不明白上面的话。它是否说在某些情况下可以使用“采样和渲染到相同的纹理”并具有定义的结果。那么该怎么做呢?如何解决我目前的情况,因为我想保存一个纹理变量。
【问题讨论】:
-
您的目标是什么版本的 OpenGL? GL4 有图像加载/存储可以帮助你,但你必须自己实现同步。
-
OpenGL 3.2。我的困惑是:在这里我总是写入与之前读取相同的像素。那么为什么它不起作用呢?第二个链接意味着在某些情况下它可以工作?
-
您可以在 NV 硬件上使用 texture barriers 来做到这一点。我不知道其他供应商是否曾经采用过该扩展,考虑到它在添加计算机着色器和图像加载/存储时基本上已经过时了。
-
谢谢。那么请您解释一下为什么我的情况无法解决,因为兴趣过程的写入和读取不是同时进行的。
标签: opengl textures fragment-shader