2016-05-23 78 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