黑科技Shader着色器实现(一) 冲击波纹扩散效果
Shader又名渲染着色器,是电脑GPU流水线上一些可以高度编程的阶段,即可以在GPU上运行的代码。
Shader有一些特定类型的着色器。(如顶点着色器、片元着色器等),依靠着色器我们可以控制渲染流水线中的渲染细节,例如用顶点着色器(Vertex)来进行顶点变换以及传递数据,用片元着色器(Pixel)来进行逐像素渲染。
简单来说,shader就是对一张纹理图片或一个物理模型的【人形tas,单帧操作】,接下来我们来实现以下冲击波特效的效果。
看到这个效果,我们发现:
- 这个效果的实现只需要操作pixel着色器
- 实现效果的核心是像素偏移
那么什么是像素偏移呢?简单来说,就是让图片移动位置,但是shader可以实现像素级的操作。
我们可以把冲击波看成是一个圆环的扩散扭曲,因此我们可以定义圆环的半径和宽度。
1 | sampler2D Texture0; //定义图片纹理名 |
同时,我们可以用一个aspect来使我们渲染的圆环保持正圆,而不会被窗口比例拉升
1 | float aspect=fViewportWidth/fViewportHeight; |
定义一个dir,获得从效果坐标到当前像素的向量
再定义一个edgeWidth,获得从当前像素到圆环的距离
1 | float2 dir = center - uv; |
有了这些,我们就获得了一个可控制半径,宽度,拉升比例的圆环
接下来要做的就是扭曲圆环内的像素了
1 | float sinX = width +edgeWidth; |
但是,我们可以很明显的看到,扭曲范围与原图之间有明显的切割迹象,体现不出波动的效果,为了解决这个问题,我们可以用sin函数来实现扭曲与原图的自然过渡。
1 | float weight = 1 *width*sin((0.5*PI/width)*sinX); |
这样一来,我们的波动效果就完成啦!
我们还可以让半径随时间变大,实现动态效果
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Ichirinko's Blog!