【译】(着色器库)在GLSL中处理后的漩涡特效

发表于2015-12-24
评论1 2.5k浏览
  效果图


  更新(2014.06.25): 一个可用的扭曲特效示例也在GLSLHACKER这里,或者可以访问这里来获取更多信息


   今天我们着色器库的一个新的 pixel hack成员发布了一个新的作品:那就是这个受欢迎的漩涡(或是旋转)的效果,跟往常在GLSL中编码一样,你只需要些许修改就可以将这个漩涡特效用于任何OpenGL应用中.涡流效应的原理是旋转纹理坐标。
   我会尽快编写出一个小型的GeeXLab 示例来展示旋转过滤处理的运行情况。你可以交互的调整不同的参数(半径、角度和漩涡中心位置)。这个示例在GeeXLab 代码示例包 (PostFX_Swirl/ folder)中.
   你需要最新版本的GeeXLab才能运行的示例,在DEMO.xml中运行GeeXLab并加载(或者拖放)示例.仅此而已.
我只在Radeon 显卡(型号:HD5850)+Cat11.4中测试了这个基于GLSL的漩涡特效。但是它应该也能在NVIDIA的显卡上正常运行。如果不是这样的话,请留下你的评论。
  完整的 加工后的漩涡/旋转GLSL着色器:
[Vertex_Shader]
void main()
{
gl_Position = ftransform();
gl_TexCoord[0] = gl_MultiTexCoord0;
}
 
[Pixel_Shader]
// 场景缓存
uniform sampler2D tex0;
// 目前在这个示例中不使用!
uniform float time;
// GeeXLab 内置 uniform
// 当然目标渲染的宽度
uniform float rt_w;
// GeeXLab 内置 uniform,
// 当前渲染目标的高度
uniform float rt_h;
// 漩涡特效参数
uniform float radius = 200.0;
uniform float angle = 0.8;
uniform vec2 center = vec2(400.0, 300.0);
vec4 PostFX(sampler2D tex, vec2 uv, float time)
{
vec2 texSize = vec2(rt_w, rt_h);
vec2 tc = uv * texSize;
tc -= center;
 float dist = length(tc);
 if (dist < radius)
 {
 float percent = (radius - dist) / radius;
 float theta = percent * percent * angle * 8.0;
 float s = sin(theta);
 float c = cos(theta);
tc = vec2(dot(tc, vec2(c, -s)), dot(tc, vec2(s, c)));
 }
tc += center;
vec3 color = texture2D(tex0, tc / texSize).rgb;
 return vec4(color, 1.0);
}
void main (void)
{
vec2 uv = gl_TexCoord[0].st;
gl_FragColor = PostFX(tex0, uv, time);
}
  源着色器: 我改编了 这个漩涡WEBGL代码(太简单了我知道…)GeeXLab。


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