【译】(着色器库)GLSL中的交叉拼接后置处理过滤器

发表于2016-03-16
评论0 1.2k浏览


  你知道Pixel Bender吗?简而言之,它就是Photoshop图象处理的一个插件。使用Pixel Bender最酷的一点就是它的效果库中有许多不同的后置处理过滤器。
  这里有一个适合GeeXLab/GLSL的Pixel Bender着色器(或内核)。这是后置处理过滤器运行交叉拼接后的效果。默认情况下,会产生这种渲染效果:


  但是,如果你能修改一点点源代码的话,就会得到这种不错的效果:


  你也可以在这里下载GeeXLab中案例的源代码:


  你需要GeeXLab0.2.10或者更高的版本来运行这个案例。启动GeeKLab,然后加载(或拖拽)GeeKLab上的DEMO.xml文件,如此而已。
  这里是完整的GeeKLab的交叉拼接GLSL着色器(或者支持GLSL着色器的另一个应用程序):
[Vertex_Shader]
void main()
{  
  gl_Position = ftransform();      
  gl_TexCoord[0] = gl_MultiTexCoord0;
}
[Pixel_Shader]
uniform sampler2Dtex0;
uniform floattime;
uniform floatrt_w;
uniform floatrt_h;
uniform floatstitching_size = 6.0;
uniform int invert= 0;
vec4PostFX(sampler2D tex, vec2 uv, float time)
{
  vec4 c = vec4(0.0);
  float size = stitching_size;
  vec2 cPos = uv * vec2(rt_w, rt_h);
  vec2 tlPos = floor(cPos / vec2(size, size));
  tlPos *= size;
  int remX = int(mod(cPos.x, size));
  int remY = int(mod(cPos.y, size));
  if (remX == 0 && remY == 0)
    tlPos = cPos;
  vec2 blPos = tlPos;
  blPos.y += (size - 1.0);
  if ((remX == remY) ||
     (((int(cPos.x) - int(blPos.x)) ==(int(blPos.y) - int(cPos.y)))))
  {
    if (invert == 1)
      c = vec4(0.2, 0.15, 0.05, 1.0);
    else
      c = texture2D(tex, tlPos * vec2(1.0/rt_w,1.0/rt_h)) * 1.4;
  }
  else
  {
    if (invert == 1)
      c = texture2D(tex, tlPos * vec2(1.0/rt_w,1.0/rt_h)) * 1.4;
    else
      c = vec4(0.0, 0.0, 0.0, 1.0);
  }
  return c;
}
void main (void)
{
  vec2 uv = gl_TexCoord[0].st;
  if (uv.y > 0.5)
  {
    gl_FragColor = PostFX(tex0, uv, time);
  }
  else
  {
    uv.y += 0.5;
    vec4 c1 = texture2D(tex0, uv);
    gl_FragColor = c1;         
  }
}
  你可以在这里得到原始Pixel Bender的交叉拼接效果
  更多的后期处理着色器可以在这里找到:着色器库
  背景图片:ubunku

原文链接:http://www.geeks3d.com/20110408/cross-stitching-post-processing-shader-glsl-filter-geexlab-pixel-bender/
  版权声明:原文作者未做权利声明,视为共享知识产权进入公共领域,自动获得授权

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

0个评论