如何在不使用第二个纹理或帧缓冲区的情况下使用OpenGL着色器修改现有纹理/帧缓冲区?这甚至可能吗?
答案 0 :(得分:5)
起初: 使用this extension在同一个传递中读取和写入技术上是可行且安全的 - 但我不建议这样做,特别是对于学习者而言,因为扩展受到严格限制,并且可能不支持每个硬件。
话虽如此:
因此,不可能使用与采样器和帧缓冲区相同的纹理?
您可以使用相同的纹理作为帧缓冲纹理附件并渲染它,并作为纹理采样器在着色器中查找值,但不在同一个传递中。这意味着,如果您有两个纹理,您可以从A读取并写入B,然后切换纹理并从B读取并写入A.但绝不是A-> A或B-> B(没有提到扩展名)。
作为技术细节,当前用作目标的纹理也可以同时绑定到采样器着色器变量,但不能使用它。
所以让我说我想模糊纹理的一小部分。我必须通过着色器运行它到第二个纹理,然后将该纹理复制回第一个纹理/帧缓冲区?
第二个纹理是。但出于效率原因,请勿复制纹理数据。只需删除源纹理并使用您将来渲染的目标纹理。如果必须经常这样做,请将源纹理保留为渲染目标,以便以后使用以提高性能。如果你必须每帧都这样做,只需每帧交换纹理。开销很小。
答案 1 :(得分:0)
使用下面的代码来制作它很棘手。
// in fragment shader
uniform sampler2D input;
out vec4 color;// bind sampler and framebuffer with same texture
void main(){
ivec2 pos = ivec2(gl_FragCoord.xy);
if(cond){
color = vec4(0.0);
}else{
color = texelFetch(input, pos, 0);
}
}