庄懂老师https://space.bilibili.com/6373917?spm_id_from=333.788.b_765f7570696e666f.1第五课
phone
Blinn phone
两者区别是Blinn Phone逆光下效果不好,相对Phone比较省资源(现阶段影响很小)
兰伯特加phone的连连看
-Shader "Unlit/Lap and phone code" {
Properties {
//定义参数
_MainColor("颜色",color)=(0.129,0.683,0.613,1)
_SpecularPow("高光次数",range(1,90))=30
}
SubShader {
Tags {
"RenderType"="Opaque"
}
LOD 100
Pass {
Name "FORWARD"
Tags {
"LightMode"="ForwardBase"
}
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
#pragma multi_compile_fwdbase_fullshadows
#pragma multi_compile_fog
#pragma target 3.0
//输入参数
uniform float3 _MainColor;
uniform float _SpecularPow;
//输入结构
struct VertexInput {
float4 vertex : POSITION; //输入模型顶点信息
float3 normal : NORMAL; //输入模型法线信息
};
//输出结构
struct VertexOutput {
float4 posCS : SV_POSITION; //由模型顶点信息换算的顶点屏幕位置
float4 posWS : TEXCOORD1;//由模型顶点信息换算的世界顶点信息(vDir =归一化(摄像机位置- posWS))
float3 nDirWS : TEXCOORD0; //由模型法线信息换算来的世界空间法线信息
};
//输入结构>>>顶点Shader>>>输出结构
VertexOutput vert (VertexInput v) {
VertexOutput o = (VertexOutput)0; //新建输出结构
o.posCS = UnityObjectToClipPos( v.vertex ); //
o.posWS = mul(unity_ObjectToWorld, v.vertex);
o.nDirWS = UnityObjectToWorldNormal(v.normal); //把模型法线转换成世界空间法线信息
return o;
}
//输出结构>>>像素
float4 frag(VertexOutput i) : COLOR {
//准备向量
float3 nDir = i.nDirWS;
float3 lDir = _WorldSpaceLightPos0.xyz;
float3 vDir = normalize(_WorldSpaceCameraPos.xyz - i.posWS.xyz);
float3 hDir = normalize(lDir + vDir);
//准备点积结果
float ndotl = dot(nDir,lDir);
float hdotn = dot(hDir,nDir);
//光照模型
float lambert = max(0.0,ndotl);
float blinnPhong = pow(max(0,hdotn),_SpecularPow);
float3 finalColor =_MainColor * lambert + blinnPhong;//建议用3维颜色乘1维兰伯特反过来在少数情况下可能会有bug
return float4(finalColor,1.0); //输出最终颜色
}
ENDCG
}
}
FallBack "Diffuse"
CustomEditor "ShaderForgeMaterialInspector"
}
兰伯特和blinn phone代码
}
float4 frag(VertexOutput i) : COLOR {
//输入向量
float3 lDir = _WorldSpaceLightPos0.xyz;
float3 nDir = i.nDirWS;
float3 vDir = normalize(_WorldSpaceCameraPos.xyz - i.posWS.xyz);
float3 rDir =reflect(-lDir,nDir);
//点积
float ndotl = dot(nDir,lDir);
float ldotv = dot(rDir,vDir);
//光照模型
float lambert = max(0,ndotl);
float phone = pow(max(0,ldotv),_SpecularPow);
float3 finalRGB = _MainColor*lambert + phone;
return fixed4(finalRGB,1);
}
兰伯特加phone修改此段
再补充一个自己瞎练的创意题