前言
最开始是想实现一个黑洞扭曲空间效果的shader,后来发现可以简化成漩涡效果,于是在网上搜索各种资料。主要参考这篇文章 猛击我。但是这篇文章是基于顶点shader实现的,对于2d中的sprite只有4个顶点,所以在扭曲顶点uv坐标时并不能达到想要的效果,而对于3d则是mesh网格中的顶点数目越多实际效果越好,那如何能让2d中的sprite也能实现漩涡扭曲效果呢。
原理
可以引用unity文档中对于扭曲图像效果的说明:旋转扭曲图像特效是指在一个圆形区域内扭曲所渲染的图像。在圆形区域中心的像素被旋转一定的角度,而其他像素的旋转程度随着距中心距离的增大而减小,在圆形区域边界减小到0。所以有2种方式实现这一过程:
1.可以旋转顶点坐标本身。
2.可以旋转顶点对应的纹理坐标。
由于我们在顶点shader中没法拿到每个像素点的坐标值,所以我们用第二种方式实现。
实现
首先是顶点shader(Vortex.vsh)
再看核心实现,像素shader(Vortex.fsh)
在看看c++代码中的核心实现:
然后起个定时器,在定时器里面实现随时间旋转角度不断增大的效果: