OpenGL 3.0 ES - 从同一纹理读取和写入不相交
OpenGL 3.0 ES - Disjoint read and write from same texture
我的情况是我有一个 (n+1)x(n+1) 纹理附加到帧缓冲区。
我的想法是分两次更新这个纹理。
画一个全屏四边形,用scissor测试把最外面的1个像素遮掉,所以我写到贴图的n x n 'inner'
第二遍,我绘制线基元以写入最外层像素,并更新相同的纹理,使用第 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' 了解详情。
我的情况是我有一个 (n+1)x(n+1) 纹理附加到帧缓冲区。 我的想法是分两次更新这个纹理。
画一个全屏四边形,用scissor测试把最外面的1个像素遮掉,所以我写到贴图的n x n 'inner'
第二遍,我绘制线基元以写入最外层像素,并更新相同的纹理,使用第 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' 了解详情。