OpenGL ES交换像素
问题描述:
我尝试开发一个交换像素(相机预览)底部< =>顶部的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;
}
你知道如何交换我的图中的像素(使我的第一个顶点着色器工作)? 谢谢
答
避免if
声明在着色器performance可能会恶化。
简单的解决方案可能是交换片段着色器中的纹理坐标。我想你的v
纹理坐标沿着渲染相机图像的四边形的整个高度从0到1。然后下面的片段着色器中的代码应该做的伎俩。
textureCoordinate = vec2(textureCoordinate.u, 1 - textureCoordinate.v);
但是,实际的纹理坐标交换取决于您在四边形顶点定义纹理坐标的方式。
我第二。您需要交换纹理坐标,而不是顶点位置。你在屏幕上看到垃圾的原因是你将某些顶点从屏幕上移开。 –
谢谢! 但在片段着色器?因为我认为我必须避免在片段着色器中运行处理,因为在交换之后,我必须放大图像的一部分... 您是否认为可以在顶点着色器中执行所有操作? – far38
可以在分段或顶点着色器中进行交换和缩放。使用输入制服来定义您的缩放(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