我的RGBA16F纹理有深度,normal.x,normal.y就可以了。我想读取r,g,b并写入纹理上的a。我将完全按下每个像素一次。
如果在这种情况下读取和写入相同的纹理会不会出现性能问题?
答案 0 :(得分:8)
不存在性能问题。将出现功能问题。如同,它将无法正常工作。
您无法从通过FBO写入的图像中读取并希望获得合理的结果。这会产生不确定的行为。
如果您使用shader_image_load_store进行阅读/写作,您可能可以逃脱它。但即使这样,它也是一个读/修改/写操作;你必须回写你读过的阿尔法。
话虽这么说,如果你确定你会“击中每个像素 完全 一次”(强调添加),你确实有一个追索权。即,NV_texture_barrier。不要让这个扩展名上的“NV”欺骗你;它也广泛应用于AMD硬件(所有HD系列卡)。这个扩展允许你使用“屏障”功能(实际上是一个告诉GPU清除帧缓冲和纹理缓存的函数),在调用之后,它将允许你完全一次传递read /在片段着色器中修改/写入。在那一次传球之后,你需要在第二次传球之间设置另一个障碍。
答案 1 :(得分:4)
如果在这种情况下读取和写入相同的纹理会不会出现性能问题?
纹理可以是数据源,也可以是目标,互斥。你不能同时使用纹理。
纹理写入(好吧,图像写入)也仅在OpenGL-4.2中引入,并且它们的性能不是很好,因为GPU针对收集读取进行了优化,而不是分散写入。
答案 2 :(得分:1)
您无法同时从单个纹理读取和写入。为了解决这个问题,你通常会创建另一个纹理,以便从一个纹理中读取并写入另一个纹理。然后可以在着色器中一起或单独回读这两个纹理。
答案 3 :(得分:0)
如果您可以先写入然后将结果复制到纹理,则可以执行此操作。在这种情况下,首先使用着色器渲染,然后在渲染完所有渲染后,将结果复制到带有
的纹理glTexImage2D(GL_TEXTURE_2D, 0,GL_RGB, windowWidth, windowHeight, 0,GL_RGB, GL_UNSIGNED_BYTE, 0);
并使用此纹理作为着色器的输入。