图形流水线
unity shader
shader代码框架
描边shader
unity shader可以使用内置变量 {texturename}_TexelSize 访问纹理 2D 的特殊属性(自动获取),
所以在Properties中定义如下即可获取纹理宽度
第一个手写shader制作完成!
获取次级纹理,剑发光
_secondary参数与次级纹理的名字相同即可自动获取
发光的描边!!
shader graph
用户手册https://docs.unity3d.com/cn/Packages/com.unity.shadergraph@10.5/manual/
sample texture 2d节点
放在纹理变量之后,采样之后作为颜色输出
multiply节点 可用于颜色叠加,颜色乘以其他效果即可叠加
add节点 如果原贴图是黑色上面有一些其他颜色的点,就要用add节点,因为黑色rgb是0,0,0,乘其他颜色都会变成0,而用加法可以得到发光的部位
shader graph中不同材质选项fragment会有不同的block node
sine
sine函数输入值为某个通道的颜色,颜色取值范围为[0,1]
eg:
normal from height
取法向量的贴图(制造凹凸感,左下角黑色和白色值差距从0-10,相当于高度差,那么经过normal from height,strength越大,波纹越明显)eg:
注:获取屏幕快照的camerasortinglayertexture变量需要取消勾选expose,否则获取不到当前屏幕快照
注:选择ripple物体的图片时需要选择独立的图片,不能选择一整张图片中sprite editor切割的图片,否则取到的屏幕快照会很多条纹
注:可以通过调整polar coordinates节点的center位置来调整后续波纹方向,比如控制水波方向,气波方向等
tilling and offset
注:本节点中的offset的x、y的范围是[0,1]
0表示当前屏幕像素点对应当前屏幕快照纹理同坐标的点,1表示偏移一倍的纹理尺寸,波纹案例中纹理是屏幕快照,所以当x为1时,显示的图案如下图:
y同理
normal from height生成法线贴图,如果是平面,则法线向量为(0,0,1),从而normal from height 的 out的三维向量中的(x,y)为(0,0),输入到tilling and offset则其贴图没有变化,若不是平面,则法线向量的xy不为(0,0),则输入到tilling and offset则其贴图offset发生变化,则会产生水纹效果
自建shader graph
水纹效果
由postfxmask.shader翻译为shader graph
shader graph如下
上图:
选择圆圈图片中的红绿通道作为后面偏移量的x、y值,因为shader graph中rgba范围都为[0,1],所以图中红绿在圆圈上的取值为[0,1],首先*_DistortIntensity,此系数在rippleeffect.cs中动态控制,如下图,之后对红绿通道分别0.001此时取值范围为[0,0.001_DistortIntensity],所以multiply中的预览图显示全黑(因为只有一个输入值,所以转换为黑白的颜色表示[0,1]之间取值)。
上图中,screen position选择default模式,返回当前点对应裁剪空间的位置,即屏幕位置
此操作对应原shader的此处
确定偏移量后,通过tilling and offset节点作为uv输入给屏幕快照截图纹理,最后输入给片断着色器的base color。
_CameraSortingLayerTexture的获取方法见上篇笔记。
注:scene position节点作为uv输出给后面sample texture2d节点,找到了当前物体对应屏幕的位置,如果不用scene position节点作为uv,效果如下图
当前物体会映射整个屏幕截图
注,本例中波纹大小与rippleeffect物体选择的图片大小一致
其原因为screen position返回当前物体中的点对应的在屏幕中的位置,而在rippleeffect.cs中又指定了当前物体大小为1倍大小,所以在编辑器中调整的scale也无效。
b站波纹效果bug
注:中心点设置bug
中心点设置参数需要暴露出去,否则默认为0,而非default中填的0.5,default中填的只是给shader graph界面预览的
如果没暴露,则会如下图
中心点相当于0,0
注:normal from height中的strength不能太小,否则会像上图那样,正确应该如下图
注:b站波纹shader获取不到屏幕快照bug
如上图,只有一个黑色方块
原因如下图