[小白自学]Shader-09-实现动态屏幕像素点

功能描述:
在游戏中有时会需要模拟类似老式CRT电视机像素点的效果,可以利用噪声贴图直接添加像素点,这里是不使用噪声贴图直接在shader中周期绘制像素点的方法实现该效果。

效果:

参数:

mainTexture:    { value: white }
mainColor:      { value: [1, 1, 1, 1], editor: { type: color } }
//像素密度
pixDensity:     { value: 0.1, editor: { slide : true, range : [0,1], step: 0.1 } }
//像素尺寸,可以分别调节宽高
pixSize:        { value: [3.0,5.0], editor: { slide : true, range : [2.0,10.0], step: 1.0 } }

核心思路:
利用周期函数绘制绘制网格或者点状patten呈现像素噪点的效果。

  int modInt(float x, float repetitve, float factor) {
    float scalex = factor * x * 1000.0;
    return int(scalex) - int(repetitve * floor(scalex / repetitve));
  }

  vec4 frag () {
    //通过放缩取模的方式获取周期性,当然也可以使用更高效的周期函数
    int modx = modInt(v_uv.x, pixSize.x, pixDensity);
    int mody = modInt(v_uv.y, pixSize.y, pixDensity);

//使用宏控制是绘制网格还是绘制点
#if USE_REVERSE_PIXEL
    vec4 col = mody == 0 || modx == 0 ? vec4(0.0,0.0,0.0,1.0) : mainColor * texture(mainTexture, v_uv);
#else
    vec4 col = mody == 0 || modx == 0 ? mainColor * texture(mainTexture, v_uv) : vec4(0.0,0.0,0.0,1.0);
#endif

    return CCFragOutput(col);
  }

问题: 当pattern密集时渲染会出现摩尔纹,这在有时效果需要时是有益的而另一些时候可能是有害的,请酌情考虑使用,欢迎讨论其他实现方案。

2赞

up,可以整理个合集发到b站

谢谢关注!有空我会考虑用视频记录一下制作步骤 :smile: