【译】夜视镜效果后期特效 (GLSL)

发表于2015-12-01
评论0 4k浏览

夜视镜效果后期特效 (GLSL)

翻译源文章:http://www.geeks3d.com/20091009/shader-library-night-vision-post-processing-filter-glsl/  侵权删

 

这个夜视shaderGeeks3D的夜视特效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].< effectCoverage) 

·   {

·   vec2 uv; 

·   uv.= 0.4*sin(elapsedTime*50.0); 

·   uv.= 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)

·   *= colorAmplification; 

·   vec3 visionColor = vec3(0.1, 0.95, 0.2);

·   finalColor.rgb = (+ (n*0.2)) * visionColor * m; //颜色混合 visionColor 为夜视镜颜色

·   }

·   else

·    {

·     finalColor = texture2D(sceneBuffer, 

·   gl_TexCoord[0].st);

·    }

·   gl_FragColor.rgb = finalColor.rgb;

·   gl_FragColor.= 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平台都测试以下呀。

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引