OpenGl读取和写入相同的纹理

OpenGl read and write to the same texture

本文关键字:纹理 读取 OpenGl      更新时间:2023-10-16

我有一个RGBA16F纹理,上面有深度,normal.x,normal.y。我想在纹理上读取r、g、b并写入a。我会准确地命中每个像素一次。

如果在这种情况下对同一个纹理进行读写,会不会出现性能问题?

不会出现性能问题。将出现功能问题。和在一样,它不起作用。

你不能通过FBO从你正在写的图片中阅读并期望得到合理的结果。这会产生未定义的行为。

如果你使用shader_image_load_store进行读/写,你可能会逃脱惩罚。但即便如此,这也是一个读/修改/写操作;你必须把你读到的字母写回来。

话虽如此,如果你确信你会"准确地命中的每个像素一次"(强调部分增加),你确实有追索权。即NV_texture_barrier。不要让这个扩展上的"NV"欺骗你;它也在AMD硬件上广泛实现(所有HD系列卡)。此扩展允许您使用"barrier"函数(实际上是一个告诉GPU清除帧缓冲区和纹理缓存的函数),该函数在调用后将允许您在片段着色器中执行一次读取/修改/写入过程。在那次传球之后,你需要在那次和第二次传球之间设置另一道屏障。

如果在这种情况下对同一个纹理进行读写,会不会出现性能问题?

纹理可以是数据源,也可以是目标,相互排斥。不能同时对两者使用纹理。

此外,纹理写入(好吧,图像写入)仅在OpenGL-4.2中引入,而且它们的性能不是很好,因为GPU是为收集读取而优化的,而不是分散写入。

您不能同时从单个纹理读取和写入。为了解决这个问题,你通常会创建另一个纹理,这样你就可以从一个纹理中读取并写入另一个。然后可以在着色器中一起或单独读取这两个纹理。

如果可以先写入,然后将结果复制到纹理中,就可以实现这一点。在这种情况下,首先使用着色器进行渲染,然后在所有渲染完成后,将结果复制到具有的纹理中

glTexImage2D(GL_TEXTURE_2D, 0,GL_RGB, windowWidth, windowHeight, 0,GL_RGB, GL_UNSIGNED_BYTE, 0);

也可以使用此纹理作为着色器的输入。