6

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

如果我在这种情况下读取和写入相同的纹理,会不会出现性能问题?

4

4 回答 4

10

不会有性能问题。会有功能问题。如题,是行不通的。

您无法从通过 FBO 写入的图像中读取并期望获得合理的结果。这会产生未定义的行为。

如果您使用 shader_image_load_store 进行读/写,您也许可以侥幸逃脱。但即便如此,它也是一个读/修改/写操作;你必须写回你读过的阿尔法。

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

于 2012-07-10T18:42:25.493 回答
4

如果我在这种情况下读取和写入相同的纹理,会不会出现性能问题?

纹理可以是数据源或目标,互斥。您不能同时为两者使用纹理。

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

于 2012-07-10T10:10:25.203 回答
1

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

于 2012-07-10T19:21:52.357 回答
0

如果您可以先编写然后将结果复制到纹理,则可以做到这一点。在这种情况下,您首先使用着色器进行渲染,然后在渲染完所有内容后,将结果复制到纹理中

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

并且还使用此纹理作为着色器的输入。

于 2017-04-22T18:39:36.120 回答