OpenGL 3.0 ES - 从同一纹理读取和写入不相交

OpenGL 3.0 ES - Disjoint read and write from same texture

我的情况是我有一个 (n+1)x(n+1) 纹理附加到帧缓冲区。 我的想法是分两次更新这个纹理。

  1. 画一个全屏四边形,用scissor测试把最外面的1个像素遮掉,所以我写到贴图的n x n 'inner'

  2. 第二遍,我绘制线基元以写入最外层像素,并更新相同的纹理,使用第 1 遍的结果作为输入。此步骤的计算取决于在第一遍中计算的内部 (n x n) 网格的状态。

在第二遍中,我将绑定第一遍的结果以供读写。我知道根据 OpenGL 这会产生未定义的行为,但由于我从来没有同时从相同的纹理元素读取和写入,所以我认为它可以工作。

这样做是个好主意,还是绘制一个全屏四边形可能更好,然后在我的 glsl 着色器中进行如下检查:

if (gl_FragCoord.x == 0.5 || gl_FragCoord.x == n + 0.5){
   ...
}

正如您所说,OpenGL 表示它是未定义的行为,因此它不会工作。像这样的事情你最好的选择是在两个渲染目标之间来回切换。

Since I am never reading and writing simultaneously from the same texels, I think it could work.

不幸的是,这没有帮助。实际上,移动设备(特别是 Mali 和 PowerVR GPU)上有一些常见的扩展,允许您同时读取和写入,但前提是它是 相同 纹素。 Google 'Pixel Local Storage' 了解详情。