本文是视频课程《Unity技术美术TA:Shader篇》,算是对自己学习的总结,也希望分享下所学知识~~
(原课程链接传送门)
纹理有啥用?
负责物体长什么样,用极少的性能表现出好的效果
1.表面色
2.凹凸法线
3.存数值
像素:显示器屏幕上的像素
纹素:图片上的像素(针对图片本身)
纹理管线
1.根据顶点位置查找坐标的UV位置,是3d建模软件制作,(投影函数)
2.UV坐标可以在光栅化阶段计算出来,通过UV的点查找贴图上面的纹素,(映射函数)
3.获取颜色值,返回给模型,(值变换函数)
纹理采样
_Name("Display Name", 2D) = "" {}
sampler2D _Name;
text2D( _Name, uv )
片段舍弃
clip( x ),如果x<0,就舍弃
一般可以用某个颜色值的 减去 定义的限制值变量
//阈值
_Clip("Clip", Range(0,1)) = 0
fixed4 frag(v2f i) : SV_Target
{
//uv zw 用作_DissolveTex 的采样
fixed4 dissolveTex = tex2D(_DissolveTex, i.uv.zw);
clip(dissolveTex.r - _Clip);
}
_DisssolveTex,为噪声图,越黑越靠近0,越先被剔除
UV的Tiling与Offset
是两个设置
Tiling:重复度,越大就越小,正常是1:1
Offset:偏移
会根据图片的设置决定平铺还是重复
变体:
优点:多个功能与效果集成到一个 Shader内,便于使用和管理
缺点:数量过多会导致加载时间过长与内存占用增加(优化重点)
变体的类型:
1.无论如何都会被编译的变体
#pragma multi_compile _ NAME (变体名必须全大写)
2.通过材质的使用情况来决定是否编译的变体
溶解效果可以做成变体,正常状态不需要,死亡时才展示溶解
Properties
[Toggle] _DissolveEnabled("Dissolve Enabled", int) = 0
Pass
//定义变体
#pragma multi_compile _ _DISSOLVEENABLED_ON
#if _DISSOLVEENABLED_ON
// ... Logic
#endif
潜规则:名字和关键字要对应,大写_ON