片段程序为最终的颜色计算输出
Shader "Sbin/MyDiffuse"
{
SubShader
{
pass
{
//渲染路径的类型
tags("LightMode"="Vertex")
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
//引用公用方法 Unity\Editor\Data\CGIncludes\sbin
#include "unitycg.cginc"
#include "Lighting.cginc"
struct v2f
{
float4 pos: POSITION;
float4 color:COLOR;
};
v2f vert(appdata_base v)
{
v2f o;
o.pos=mul(UNITY_MATRIX_MVP,v.Vertex);
//发向量
float3 N= normalize(v.normal);
//发向量转到世界坐标系
//光照向量
float3 L=normalize(_WorldSpaceLightPos0);
//光向量旋转到模型空间
//N=mul(_Object2World,float4(N,0)).xyz;
//逆矩阵的转置矩阵的乘法,用于不等比缩放
N=mul(float4(N,0),_Object2World).xyz;
//L=mul(_World2Object,float4(L,0)).xyz;
//把点积的结果限制到0到1范围内
float ndot1=saturate( dot(N,L));
o.color=_LightColor0*ndot1;
//顶点光源对物体的影响,基于Vertex模式
//o.color.rgb=ShaderVertexLights(v.Vertex,v.normal);
float3 wpos=mul(_Object2World,v.Vertex).xyz;//顶点在世界坐标中的位置
o.color.rgb += Shade4PointLights(unity_4LightPosX0,unity_4LightPosY0,unity_4LightPosZ0,unity_4LightAtten0,
unity_LightColor[0].rgb,unity_LightColor[1].rgb,unity_LightColor[2].rgb,unity_LightColor[3].rgb,
wpos,N
);
return o;
}
fixed4 frag(v2f IN):COLOR
{
//加上环境光源
return IN.color+UNITY_LIGHTMODEL_AMBIENT;
}
ENDCG
}
}
}