使用两种内建的方法计算点光源光照
1
.Shader "Custom/test1" {
SubShader {
pass
{
//使用unitycg.cginc中内建的点光源计算方法
//不同方法对应不同的tag ShadeVertexLights->Vertex 该方法传入顶点处于模型坐标系的顶点以及法线
Tags{"LightMode"="Vertex"}
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "unitycg.cginc"
#include "lighting.cginc"
struct v2f{
float4 pos:POSITION;
fixed4 col: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);
L = mul(L,_Object2World).xyz;
float ndot =saturate(dot(L,N));
o.col = _LightColor0*ndot+UNITY_LIGHTMODEL_AMBIENT;
//使用ShadeVertexLights方法计算光照颜色
o.col.rgb = ShadeVertexLights(v.vertex,v.normal);
return o;
}
fixed4 frag(v2f IN):COLOR
{
//光照计算放在片段程序中,交接顶点会变得比较平滑
return IN.col;
}
ENDCG
}
}
}
2.
Shader "Custom/test1" {
SubShader {
pass
{
//使用unitycg.cginc中内建的点光源计算方法
//不同方法对应不同的tag Shade4PointLights->ForwardBase 该方法传入点光源的世界坐标x,y,z 光照位置数组前四个,光照衰减
//系数以及物体顶点以及法线的世界坐标
Tags{"LightMode"="ForwardBase"}
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "unitycg.cginc"
#include "lighting.cginc"
struct v2f{
float4 pos:POSITION;
fixed4 col: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);
L = mul(L,_Object2World).xyz;
float ndot =saturate(dot(L,N));
o.col = _LightColor0*ndot+UNITY_LIGHTMODEL_AMBIENT;
float3 wpos = mul(_Object2World,v.vertex).xyz;
float3 wN = mul(_Object2World,v.normal);
//使用Shade4PointLights方法计算光照颜色,参数很多需要使用内建的变量
o.col.rgb += Shade4PointLights(unity_4LightPosX0,unity_4LightPosY0,unity_4LightPosZ0,
unity_LightPosition[0].xyz,unity_LightPosition[1].xyz,unity_LightPosition[2].xyz,
unity_LightPosition[3].xyz,unity_4LightAtten0,wpos,wN);
return o;
}
fixed4 frag(v2f IN):COLOR
{
//光照计算放在片段程序中,交接顶点会变得比较平滑
return IN.col;
}
ENDCG
}
}
}