查找着色器的想法

时间:2013-08-09 11:51:31

标签: opengl-es glsl

以下是着色器的示例:

varying highp vec2 textureCoordinate;


varying highp vec2 textureCoordinate2; // TODO: This is not used

 uniform sampler2D inputImageTexture;
 uniform sampler2D inputImageTexture2; // lookup texture

 void main()
 {
     lowp vec4 textureColor = texture2D(inputImageTexture, textureCoordinate);

 mediump float blueColor = textureColor.b * 63.0;

 mediump vec2 quad1;
 quad1.y = floor(floor(blueColor) / 8.0);
 quad1.x = floor(blueColor) - (quad1.y * 8.0);

 mediump vec2 quad2;
 quad2.y = floor(ceil(blueColor) / 8.0);
 quad2.x = ceil(blueColor) - (quad2.y * 8.0);

 highp vec2 texPos1;
 texPos1.x = (quad1.x * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * textureColor.r);
 texPos1.y = (quad1.y * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * textureColor.g);

 highp vec2 texPos2;
 texPos2.x = (quad2.x * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * textureColor.r);
 texPos2.y = (quad2.y * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * textureColor.g);

 lowp vec4 newColor1 = texture2D(inputImageTexture2, texPos1);
 lowp vec4 newColor2 = texture2D(inputImageTexture2, texPos2);

 lowp vec4 newColor = mix(newColor1, newColor2, fract(blueColor));
 gl_FragColor = vec4(newColor.rgb, textureColor.w);

}

此着色器可添加图像周围蓝色边缘的效果。它使用额外的纹理进行计算。这是纹理: https://github.com/BradLarson/GPUImage/blob/master/framework/Resources/lookup.png 有人可以解释这种纹理的目的。在代码中,此纹理存储在inputImageTexture2变量中。什么是想法和算法? 例如,如果想要获得红色边缘而不是蓝色,我需要如何修改输入纹理。

感谢。

1 个答案:

答案 0 :(得分:2)

这个特殊的过滤器是由Lev Zelensky编写的,他在his blog上描述了它的配置。

基本上,您从基本RGB查找表开始,将其带入Photoshop并应用要重现的颜色效果,然后获取生成的图像并将其用作此过滤器的查找表。对于图像中的每个RGB值,将找到并使用该表中最接近的匹配,而不是原始颜色。

至于为什么在图像外部看到蓝色调,请确保正确生成并保存查找表,并将其添加到过滤器的右侧输入槽中。