一.逐顶点漫反射光照模型
首先计算公式: 兰伯特模型 Cdiffuse=(Clight•mdiffuse)max(0,n•I) n表面法线,I指向光源的单位矢量,mdiffuse材质漫反射颜色,Clight光源颜色
unity操作步骤(通用就写一遍吧):
1.Unity新建场景,窗口-渲染-照明设置-天空盒子选择none
2.新建材质
3.新建unity shader ,赋给第二步的材质
4.创建胶囊体,将第二步材质赋给物体
5.保存场景
那么接下来就是代码啦!
// Upgrade NOTE: replaced '_World2Object' with 'unity_WorldToObject'
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
Shader "Custom/DiffuseVertexLevel"
{
Properties {
_Diffuse ("Diffuse", Color) = (1, 1, 1, 1)
}
SubShader {
Pass {
Tags { "LightMode"="ForwardBase" }
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "Lighting.cginc"
fixed4 _Diffuse;
struct a2v {
float4 vertex : POSITION;
float3 normal : NORMAL;
};
struct v2f {
float4 pos : SV_POSITION;
fixed3 color : COLOR;
};
v2f vert(a2v v) {
v2f o;
// Transform the vertex from object space to projection space
o.pos = UnityObjectToClipPos(v.vertex);
// Get ambient term
fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;//得到环境光
// Transform the normal from object space to world space
fixed3 worldNormal = normalize(mul(v.normal, (float3x3)unity_WorldToObject));//_World2Object从世界空间到模型
// Get the light direction in world space
fixed3 worldLight = normalize(_WorldSpaceLightPos0.xyz);//场景中只有一个平行光,_WorldSpaceLightPos0得到光源方向
// Compute diffuse term
fixed3 diffuse = _LightColor0.rgb * _Diffuse.rgb * saturate(dot(worldNormal, worldLight));//_LightColor0访问该Pass处理的光源的颜色
o.color = ambient + diffuse;
return o;
}
fixed4 frag(v2f i) : SV_Target {
return fixed4(i.color, 1.0);
}
ENDCG
}
}
FallBack "Diffuse"
}
二.逐像素漫反射光照模型
首先计算公式一样,只是把计算放到片元着色器中。
得到更平滑的光照效果,但是背光区域像平面失去细节。
// Upgrade NOTE: replaced '_World2Object' with 'unity_WorldToObject'
/