开博只为记录学习笔记。
工作两年多,发现shader的神奇之处,一直想学,却没能学进去,在此开博客,以坚定决心。
前几天买了一本《Unity着色器和屏幕特效开发秘籍》,由浅入深,目前看到了1.7.2,学到了些东西,先记录下来,刚开始学,自己理解的东西可能比较浅显,甚至有错,后面会慢慢纠正。
Shader "DQ/DQ_test_Difuse" { //shader路径
Properties {//shader的属性
_EmissiveColor("Emissive Color",Color) = (1,1,1,1)//放射色(目前理解是向光面颜色)
_AmbientColor("Ambient Color",Color) = (1,1,1,1)//环境色(背光面颜色)
_SaturateValue("Saturate",Range(0,10)) = 2.5//饱和度
_RampTex("RampTex",Rect) ="ramp"//渐变纹理
}
SubShader {
Tags { "RenderType"="Opaque" }//不透明
LOD 200//渲染先后
CGPROGRAM//开始
#pragma surface surf BasicDiffuse//没有用Lambert
float4 _EmissiveColor;//这里的名字要和Properties中的变量名一致(理解为field成员)
float4 _AmbientColor;
float _SaturateValue;
sampler2D _RampTex;
struct Input {
float2 uv_MainTex;//这里是输入,实际上这个测试shader并没有用到,但是不能删,目前还不理解原因
};
void surf (Input IN, inout SurfaceOutput o) {
float4 c;
c = pow((_AmbientColor + _EmissiveColor),_SaturateValue);//pow算颜色和饱和度
o.Albedo = c.rgb;//给输出赋颜色
o.Alpha = c.a;
}
//自己定义的光照模型,harf lambert 和 渐变纹理
inline float4 LightingBasicDiffuse(SurfaceOutput s, fixed3 lightDir, fixed atten){
float difLight = max(0, dot(s.Normal,lightDir));
//点乘(向量的夹角越小,值越大,范围-1~1,平行且同向为1,平行且反向为-1,即向光方向>0,背光方向<0) + clamp限制 [0~1]
float hLambert = difLight * 0.5 + 0.5; //限制difLight值范围0.5 ~ 1.0,避免背面颜色过暗
float3 ramp = tex2D(_RampTex, float2(hLambert)).rgb;//把渐变纹理的颜色配合亮度读出来
float4 col;
col.rgb = s.Albedo * _LightColor0.rgb * ramp;//算出的颜色和光照颜色还有surf得到的颜色相乘,得到新的颜色
col.a = s.Alpha;
return col;
}
ENDCG//结束
}
FallBack "Diffuse"
}