2013-10-24 58 views
3

我需要垂直翻转我的纹理复制到另一个texture.I当翻转时,质地知道3个简单的方法来做到这一点:复制到另一个纹理

1。从一次FBO切换到另一个全屏四次(并在碎片着色器中翻转)

2。 Blit使用glBlitFrameBuffer

3。使用glCopyImageSubData

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

做这样的:

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

它不work.The副本返回garbage.Is这种方法应该能够阅读时翻页是否有其他FBO无关方法(GPU方面只? )?

BTW:

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

不工作过。

+1

您的结果可复制宽度= 0,所以它不应该复制任何东西。但无论如何,'glCopyImageSubData'只是GPU端'memcpy',它不会执行任何转换。我只看到使用着色器(或只是翻转纹理坐标)。 – keltar

+0

用'invert-y'标志上传另一个? – mr5

回答

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

你必须调整它一点点,但我知道它的作品我之前使用它。

希望这会有所帮助

相关问题