我需要在将纹理复制到另一个纹理时垂直翻转纹理。我知道了3种简单的方法:
1。使用全屏四边形(并在碎片着色器中翻转)从FBO进入另一个FBO
2。使用glBlitFrameBuffer进行Blit。
我需要在两个没有附加到任何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 );
也行不通。
答案 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 );
}
你需要稍微调整一下,但我知道它之前我用过它。
希望这有帮助