OpenGL ES 2.0中的图像和蒙版
我正在学习OpenGL ES 2.0,我想创建一个应用程序以更好地了解它的工作原理。 该应用程序有一套过滤器,用户可以应用在图像上(我知道,没有新的:P)。
其中一个过滤器需要两个图像和一个蒙版,并将两个图像混合在一起显示蒙版(这里是一个图像,以更好地解释我想要获取的内容)
目前我非常困惑,我不知道从哪里开始创造这种效果。 我无法理解,我必须使用多个纹理和多个FrameBuffers,或者我可以使用单个着色器。
你有任何暗示帮助我完成这个项目吗?
编辑 - - - -
我找到了这个解决方案,但是当我用掩码线代替圆圈时,结果真的很“蹩脚”,特别是如果线条旋转了。
precision highp float;
varying vec4 FragColor;
varying highp vec2 TexCoordOut;
uniform sampler2D textureA;
uniform sampler2D textureB;
uniform sampler2D mask;
void main(void){
vec4 mask_color = texture2D(mask, TexCoordOut);
if (mask_color.a > 0.0){
gl_FragColor = texture2D(textureA, TexCoordOut);
}else {
gl_FragColor = texture2D(textureB, TexCoordOut);
}
}
使用模板缓冲区还是混合可能会更好?
您可以在同一行敷面膜,而无需使用昂贵的if
:
gl_FragColor = step( 0.5, vMask.r ) * vColor_1 + ( 1.0 - step( 0.5, vMask.r ) ) * vColor_2;
或者,更好的是插入两种颜色之间:
gl_FragColor = mix( vColor_1, vColor_2, vMask.r );
在这种情况下,掩模可以平滑(即用高斯模糊)以产生更少的混叠。 与单值阈值相比,这将产生非常好的结果。
不需要多个着色器或帧缓冲器,只需要多个纹理单元。 只需使用3个纹理单元,这些单元都由相同的纹理坐标索引,并使用Mask纹理在其他两个纹理之间进行选择。 片段着色器将如下所示:
uniform sampler2D uTextureUnit_1;
uniform sampler2D uTextureUnit_2;
uniform sampler2D uTextureMask;
varying vec2 vTextureCoordinates;
void main()
{
vec4 vColor_1 = texture2D(uTextureUnit_1, vTextureCoordinates);
vec4 vColor_2 = texture2D(uTextureUnit_2, vTextureCoordinates);
vec4 vMask = texture2D(uTextureMask, vTextureCoordinates);
if (vMask.r > 0.5)
gl_FragColor = vColor_1;
else
gl_FragColor = vColor_2;
}
您可以看到,使用第三个纹理单元只是在红色通道上执行二进制测试效率不高,因此最好将蒙版编码到纹理1或2的Alpha通道中,但这会让您开始。
链接地址: http://www.djcxy.com/p/33611.html