复制到另一个纹理时翻转纹理

时间:2013-10-24 11:27:05

标签: opengl

我需要在将纹理复制到另一个纹理时垂直翻转纹理。我知道了3种简单的方法:

1。使用全屏四边形(并在碎片着色器中翻转)从FBO进入另一个FBO

2。使用glBlitFrameBuffer进行Blit。

3。使用glCopyImageSubData

我需要在两个没有附加到任何FBO的纹理之间执行此复制,所以我试图避免前两个解决方案。我正在尝试第三个。

这样做:

glCopyImageSubData(srcTex ,GL_TEXTURE_2D,0,0,0,0,targetTex,GL_TEXTURE_2D,0,0,width ,0,height,0,1);

它不起作用。副本返回垃圾。这个方法应该能够在读取时翻转吗?是否有另一种FBO无关方法(仅限GPU侧)?

顺便说一下:

glCopyTexSubImage2D(GL_TEXTURE_2D,0,0,0,0,height ,width,0 );

也行不通。

1 个答案:

答案 0 :(得分:3)

通过绘制倒置四边形将纹理四边形渲染到pbo将起作用。

或者您可以通过使用2个绑定图像缓冲区反转y坐标来使用简单的片段着色器来执行imageLoad + imageStore。

glBindImageTexture(0, copyFrom, 0, GL_FALSE, 0, GL_READ_ONLY, GL_RGBAUI32);        
glBindImageTexture(1, copyTo, 0, GL_FALSE, 0, GL_WRITE_ONLY, GL_RGBAUI32);

着色器看起来像:

layout(binding = 0, rbga32ui) uniform uimage2d input_buffer;
layout(binding = 1, rbga32ui) uniform uimage2d output_buffer;
uniform float u_texHeight;
void main(void)
{
    vec4 color = imageLoad( input_buffer, ivec2(gl_FragCoord.xy) );
    imageStore( output_buffer, ivec2(gl_FragCoord.x,u_texHeight-gl_FragCoord.y-1), color );
}

你需要稍微调整一下,但我知道它之前我用过它。

希望这有帮助