基础的shader中的Lambert全部展示,拿走不谢。
Shader "Unlit/l 03/Shader/moban Lambert"
{
Properties{
_Diffuse("Diffuse Color",Color) = (1,0,1,1)
_SpecularPow("高光次幂",Range(1,90))=30
_MainCol("颜色",Color)=(1.0,1.0,1.0,1.0)
}
SubShader{
Pass{
Tags{"LightMode" = "ForwardBase"}
CGPROGRAM
#include "Lighting.cginc"
#pragma vertex vert
#pragma fragment frag
#pragma target 3.0
fixed4 _Diffuse;
float3 _MainCol;
float _SpecularPow;
struct a2v {
float4 vertex:POSITION;
float3 normal:NORMAL;
};
//输入结构
struct VertexInput{
float4 vertex :POSITION;//获取 顶点信息
float4 normal : NORMAL; //获取 法线信息
};
// 输出结构
struct VertexOutput{
float4 posCS:SV_POSITION; //裁剪空间顶点位置
float4 posWS:TEXCOORD0; //世界空间顶点位置
float3 nDirWS:TEXCOORD1; //世界空间法线位置
};
// 输入结构》》顶点Shader》》输出结构
VertexOutput vert (VertexInput v){
VertexOutput o=(VertexOutput)0; //新建输出结构体
o.posCS=UnityObjectToClipPos(v.vertex); //变化顶点位置 OS》CS
o.posWS=mul(unity_ObjectToWorld,v.vertex); //变化顶点位置 OS》WS
o.nDirWS=UnityObjectToWorldNormal(v.vertex);//变换法线方向 OS》WS
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(vDir + lDir);
//准备点积结果
float ndot1=dot(nDir,lDir);
float ndoth=dot(nDir,hDir);
//光照模型
float lambert=max(0.0,ndot1);
//返回结果
return float4(lambert,lambert,lambert,1.0);
}
ENDCG
}
}
}
来自庄懂课程。