Shader "Unlit/DiffusePixelLevel"
{
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; //模型空间顶点法线normal
};
struct v2f{
float4 pos : SV_POSITION;
fixed3 worldNormal : TEXCOORD0; //世界空间法线
};
// mvp矩阵本身是通过以下矩阵的乘积形成的:
// 模型矩阵(model matrix):将顶点从模型空间变换到世界空间。
// 视图矩阵(view matrix):将顶点从世界空间变换到视图空间(摄像机空间)。
// 投影矩阵(projection matrix):将顶点从视图空间变换到裁剪空间。
v2f vert(a2v v){
v2f o;
o.pos = UnityObjectToClipPos(v.vertex);
/* _world2Object 是一个 4x4 的矩阵,表示从世界空间到对象空间的变换矩阵。
将其转换为 3x3 矩阵 (float3x3),我们只取前 3x3 部分用于法线变换。 */
o.worldNormal = mul(v.normal, (float3x3)unity_WorldToObject);
return o;
}
fixed4 frag(v2f i) : SV_Target {
//UNITY_LIGHTMODEL_AMBIENT 是一个全局变量,表示场景中的环境光颜色。.xyz 提取其 RGB 颜色分量。
fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;
fixed3 worldNormal = normalize(i.worldNormal);
fixed3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz);
// _LightColor0.rgb 是光源的颜色。
// _Diffuse.rgb 是材质的漫反射颜色。
// dot(worldNormal, worldLightDir) 计算法线和光源方向的点积,用于计算光照强度。
// saturate 将结果限制在 [0, 1] 范围内,避免负值(即避免光线背面不受光照影响)。
fixed3 diffuse = _LightColor0.rgb * _Diffuse.rgb * saturate(dot(worldNormal, worldLightDir));
// 将环境光和漫反射光相加得到最终的颜色。
fixed3 color = ambient + diffuse;
return fixed4(color, 1.0);
}
ENDCG
}
}
Fallback "Diffuse"
}
【Untiy Shader】逐像素漫反射光照
于 2024-07-30 14:27:42 首次发布
4127

被折叠的 条评论
为什么被折叠?



