【译】夜视镜效果后期特效 (GLSL)
夜视镜效果后期特效 (GLSL)
这个夜视shader将Geeks3D的夜视特效shader算法做了一些修改,我加入了简单的亮度分析用于处理放大低亮度部分。
在这里可以下载demo观察实时shader效果:
http://www.geeks3d.com/download/95
解压并运行Night_Vision_Demo.exeNight_Vision_Demo.exe就可以了。
要运行demo需要电脑安装了Python2.6.2或2.6.3.
这个demo使用GeeXLab。夜视效果源代码可在PostFX_Night_Vision_Lib.xml文件中找到。
入口代码是Night_Vision_Demo.xml.
Shader描述
语言:OpenGL2-GLSL
特效类型:后期处理过滤器
输入:
1.sceneBuffer(sampler2D):场景的2D纹理缓存。
2.noiseTex(sampler2D):噪音纹理贴图用于产生夜视设备产生的那个效果。
3.maskTex(sampler2D):用于产生夜视设备的望眼镜的圆形视野的蒙板。
4.elapsedTime(float):进过多少秒的时间。
5.luminanceThreshold(float):设置亮度的阀值,默认值为0.2.
6.colorAmplification(float):低亮度像素点的放大因子,默认值为4.0.
7.effectCoverage(float):特效在屏幕上的覆盖区域限制-demo演示需要!默认值:0.5(表示覆盖半个屏幕)。
输出:
颜色缓存。
Shader代码:
· [Vertex_Shader]
· void main()
· {
· gl_Position = ftransform();
· gl_TexCoord[0] = gl_MultiTexCoord0;
· }
· [Pixel_Shader]
· uniform sampler2D sceneBuffer;
· uniform sampler2D noiseTex;
· uniform sampler2D maskTex;
· uniform float elapsedTime; // seconds
· uniform float luminanceThreshold; // 0.2
· uniform float colorAmplification; // 4.0
· uniform float effectCoverage; // 0.5
· void main ()
· {
· vec4 finalColor;
· // 正常情况使用将 effectCoverage改为1.0
· if (gl_TexCoord[0].x < effectCoverage)
· {
· vec2 uv;
· uv.x = 0.4*sin(elapsedTime*50.0);
· uv.y = 0.4*cos(elapsedTime*50.0); //噪音贴图坐标随时间变换
· float m = texture2D(maskTex, gl_TexCoord[0].st).r;//望远镜的视野蒙版
· vec3 n = texture2D(noiseTex,
· (gl_TexCoord[0].st*3.5) + uv).rgb;//得到噪音纹理贴图颜色
· vec3 c = texture2D(sceneBuffer, gl_TexCoord[0].st
· + (n.xy*0.005)).rgb;//场景纹理颜色+噪音纹理颜色*0.005
· //处理低亮度部分
· float lum = dot(vec3(0.30, 0.59, 0.11), c);
· if (lum < luminanceThreshold)
· c *= colorAmplification;
· vec3 visionColor = vec3(0.1, 0.95, 0.2);
· finalColor.rgb = (c + (n*0.2)) * visionColor * m; //颜色混合 visionColor 为夜视镜颜色
· }
· else
· {
· finalColor = texture2D(sceneBuffer,
· gl_TexCoord[0].st);
· }
· gl_FragColor.rgb = finalColor.rgb;
· gl_FragColor.a = 1.0;
· }
在ATI Radeon显卡上测试时,先shader需要添加下面这行代码:
float lum = dot(vec4(0.30, 0.59, 0.11, 0.0), c);
这里c是vec3向量。NVIDIA GLSL编译器同样支持这些代码。
但是Radeon GLSL 编译器相对要求严格,不能编译下面这段代码。
float lum = dot(vec4(0.30, 0.59, 0.11, 0.0), c);
小总结:别忘了把你的Shader都要在ATI和NVIDIA平台都测试以下呀。