2016-05-23 77 views
0

我嘗試開發一個交換像素(相機預覽)底部< =>頂部的android應用程序。 swap diagramOpenGL ES交換像素

所以我寫了這個頂點着色器,但它顯示非常奇怪的東西(一個數字噪聲的黑屏)。

attribute vec4 vPosition; 
attribute vec2 inputTextureCoordinate; 
varying vec2 textureCoordinate; 
void main() 
{ 
    if (vPosition.y > 0.0) 
    { 
     gl_Position = vPosition - vec4(0.0, 1.0, 0.0, 0.0); 
    } 
    else 
    { 
     gl_Position = vPosition + vec4(0.0, 1.0, 0.0, 0.0); 
    } 
    textureCoordinate = inputTextureCoordinate; 
} 

但是,這個頂點着色器下面的作品,但它只能將頂部像素移動到底部。

attribute vec4 vPosition; 
attribute vec2 inputTextureCoordinate; 
varying vec2 textureCoordinate; 
void main() 
{ 
    if (vPosition.y > 0.0) 
    { 
     gl_Position = vPosition - vec4(0.0, 1.0, 0.0, 0.0); 
    } 
    else 
    { 
     gl_Position = vPosition; 
    } 
    textureCoordinate = inputTextureCoordinate; 
} 

你知道如何交換我的圖中的像素(使我的第一個頂點着色器工作)? 謝謝

回答

1

避免if聲明在着色器performance可能會惡化。

簡單的解決方案可能是交換片段着色器中的紋理座標。我想你的v紋理座標沿着渲染相機圖像的四邊形的整個高度從0到1。然後下面的片段着色器中的代碼應該做的伎倆。

textureCoordinate = vec2(textureCoordinate.u, 1 - textureCoordinate.v); 

但是,實際的紋理座標交換取決於您在四邊形頂點定義紋理座標的方式。

+0

我第二。您需要交換紋理座標,而不是頂點位置。你在屏幕上看到垃圾的原因是你將某些頂點從屏幕上移開。 –

+0

謝謝! 但在片段着色器?因爲我認爲我必須避免在片段着色器中運行處理,因爲在交換之後,我必須放大圖像的一部分... 您是否認爲可以在頂點着色器中執行所有操作? – far38

+0

可以在分段或頂點着色器中進行交換和縮放。使用輸入制服來定義您的縮放(min_u,max_u,min_v,max_v)。然後在頂點着色器中分配(min_u,max_v),左上(min_u,min_v),右上(max_u,min_v),右下(max_u,max_v)的左底部頂點紋理座標。紋理座標需要變化。這樣你會完成這兩個。在頂點着色器中縮放和交換。 – plastique