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

3

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

1.使用全屏幕四边形从一个FBO复制到另一个FBO(并在片段着色器中进行翻转)

2.使用 glBlitFrameBuffer 进行复制。

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,所以根本不应该复制任何内容。但无论如何,glCopyImageSubData只是GPU端的memcpy,它不进行任何转换。我认为使用着色器(或只是翻转纹理坐标)是唯一的选择。 - keltar
使用 invert-y 标志上传另一个吗? - mr5
1个回答

3

通过绘制翻转的四边形将纹理四边形渲染到pbo中是可行的。

或者您可以使用简单的片段着色器,通过反转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 );
}

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

希望这可以帮到你。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接