运行 OpenGL 着色器修改现有纹理/帧缓冲区
Run OpenGL shader to modify existing texture / frame buffer
如何在不使用第二个纹理或帧缓冲区的情况下使用 OpenGL 着色器就地修改现有纹理/帧缓冲区?这可能吗?
最初:
使用 this extension 在同一通道中读取和写入在技术上是可行且安全的 - 但是我不建议这样做,特别是对于学习者,因为扩展受到严格限制并且可能并非在所有硬件上都受支持。
也就是说:
So it's not possible to use the same texture as a sampler and frame buffer?
您可以使用相同的纹理作为帧缓冲区纹理附件并对其进行渲染,并作为纹理采样器在着色器中查找值,但不在同一个通道中。这意味着,如果你有两个纹理,你可以从 A 读取并写入 B,然后切换纹理并从 B 读取并写入 A。但永远不会 A->A 或 B->B(没有提到的扩展名)。
作为技术细节,当前用作目标的纹理也可以同时绑定到采样器着色器变量,但您不能使用它。
So let's say I want to blur just a small part of a texture. I have to run it through a shader to a second texture and then copy that texture back to the first texture / frame buffer?
第二个纹理是的。但出于效率原因,不要将纹理数据复制回来。只需删除源纹理并在将来使用您渲染到的目标纹理。如果您必须经常这样做,请将源纹理保留为渲染目标以供以后使用以提高性能。如果你必须每帧都这样做,只需每帧交换纹理。开销很小。
使用以下代码制作它很棘手。
// 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);
}
}
如何在不使用第二个纹理或帧缓冲区的情况下使用 OpenGL 着色器就地修改现有纹理/帧缓冲区?这可能吗?
最初: 使用 this extension 在同一通道中读取和写入在技术上是可行且安全的 - 但是我不建议这样做,特别是对于学习者,因为扩展受到严格限制并且可能并非在所有硬件上都受支持。
也就是说:
So it's not possible to use the same texture as a sampler and frame buffer?
您可以使用相同的纹理作为帧缓冲区纹理附件并对其进行渲染,并作为纹理采样器在着色器中查找值,但不在同一个通道中。这意味着,如果你有两个纹理,你可以从 A 读取并写入 B,然后切换纹理并从 B 读取并写入 A。但永远不会 A->A 或 B->B(没有提到的扩展名)。
作为技术细节,当前用作目标的纹理也可以同时绑定到采样器着色器变量,但您不能使用它。
So let's say I want to blur just a small part of a texture. I have to run it through a shader to a second texture and then copy that texture back to the first texture / frame buffer?
第二个纹理是的。但出于效率原因,不要将纹理数据复制回来。只需删除源纹理并在将来使用您渲染到的目标纹理。如果您必须经常这样做,请将源纹理保留为渲染目标以供以后使用以提高性能。如果你必须每帧都这样做,只需每帧交换纹理。开销很小。
使用以下代码制作它很棘手。
// 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);
}
}