2013-10-24 67 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); 
} 

你必須調整它一點點,但我知道它的作品我之前使用它。

希望這會有所幫助

相關問題