OpenGl读取和写入相同的纹理
OpenGl read and write to the same texture
我有一个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);
也可以使用此纹理作为着色器的输入。
- 理解boost::asio-async_read在无需读取内容时的行为
- 使用新行和不使用新行读取文件
- 读取文件并输入到矢量中
- 用c++从输入文件中读取另一行
- 读取文件的最后一行并输入到链接列表时出错
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- 无法找到/读取配置文件.conf-FileIOException
- 从相同纹理的撰写和读取OpenGL上的迭代de Solver
- 如何读取纹理数据,以便我可以编辑它
- OpenGL,GLSL片段着色器无法读取Sampler2D纹理
- OpenGl读取和写入相同的纹理
- DirectX11 网格加载 - 由于纹理而出错(使用 SDKmesh.h)?访问违规读取位置0x00000000
- 写入纹理数组的一层并从另一层读取
- 读取和写入 HLSL 5.0 中的纹理(延迟着色)
- SDL 从纹理中读取像素
- glGetTexImage使用纹理格式GL_ALPHA读取过多数据
- OpenGL:从许多帧缓冲纹理中读取空间像素数据的有效方法
- OpenGL - 无法读取/写入 2D 深度纹理数组
- 渲染到纹理,读取像素的结果大部分是黑色的
- CUDA中作为纹理的3D阵列写入和读取