3

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

1. 使用全屏四边形从一次 FBO Blit 到另一个(并在片段着色器中翻转)

2. 使用glBlitFrameBuffer进行 Blit 。

3. 使用 glCopyImageSubData

我需要在未附加到任何 FBO 的 2 个纹理之间执行此副本,因此我试图避免前 2 个解决方案。我正在尝试第 3 个解决方案。

这样做:

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 );

也不行。

4

1 回答 1

3

通过绘制倒四边形将带纹理的四边形渲染到 pbo 是可行的。

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

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 );
}

你必须稍微调整一下,但我知道我以前用过它。

希望这可以帮助

于 2013-10-24T20:56:40.327 回答