Shder效果制作
数学基础
方块矩阵:行列相等。
矩阵转置:行列元素对换。
(AB)^T = B^TA^T
(AB)^-1 = B^-1A^-1
逆矩阵:MM^-1 = M^-1M = I(可以恢复变换)
M^T^-1 = M^-1^T
正交矩阵:MM^T = M^TM = I 或者 M^T=M^-1
线性变换:矢量加和标量乘运算。
旋转和缩放属于线性变换,平移不是。
旋转定义的顺序是:zxy;
复合变换的约定:先缩放 再旋转 最后平移。
法线变换:非统一缩放需要求解原矩阵的逆转置矩阵。
残影
原理:拷贝mesh然后指定一个shader渐变改变alpha值,这个shader一定要开启混合和关闭深度测试。
边缘高光
原理:1-取相机和点的方向和法线方向点积乘以漫反射。
镜面效果
原理:用当前摄像机渲染一张x取反纹理(RT) 然后输出。
渲染纹理 和 GrabPass
渲染纹理:将一张RT放到摄像机上抓取屏幕。
GrabPass:在shader中通过命令渲染屏幕。
但是渲染纹理效率更加高效,RT分辨率和相机大小可控。GrabPass抓取和屏幕大小一样的图像。
屏幕后处理
依赖unity提供的OnRenderImage(Texture src , Texture dest)
Graphics.Blit(src, dest, material)使用一个shader拷贝src到dest中
src将要处理的屏幕图像,dest处理之后的屏幕图像。
边缘检测
使用卷积计算(需要找到一个合适的卷积核)梯度,梯度越大,越有可能是边缘,然后使用梯度lerp边缘和原图。
高斯模糊
使用卷积(卷积和为1)计算周围像素颜色值然后相加。
Bloom效果
采样图片较亮的部分然后高斯模糊和原图相加。