【问题标题】:Flipping texture when copying to another texture复制到另一个纹理时翻转纹理
【发布时间】:2013-10-24 11:27:04
【问题描述】:

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

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

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

也不行。

【问题讨论】:

  • 你得到的可复制宽度=0,所以它根本不应该复制任何东西。但无论如何,glCopyImageSubData 只是 GPU 端的memcpy,它不执行任何转换。我认为使用着色器(或只是翻转纹理坐标)是唯一的选择。
  • invert-y 标志上传另一个?

标签: opengl


【解决方案1】:

通过绘制倒四边形将带纹理的四边形渲染为 pbo 会起作用。

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

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

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

希望对你有帮助

【讨论】:

    猜你喜欢
    • 2016-10-02
    • 1970-01-01
    • 1970-01-01
    • 2011-03-16
    • 1970-01-01
    • 1970-01-01
    • 2014-09-08
    • 2017-12-09
    • 1970-01-01
    相关资源
    最近更新 更多