UnityShader初级篇——实现逐顶点漫反射光照模型

本文介绍如何在Unity Shader中实现逐顶点漫反射光照模型,并提供了详细的Shader代码示例。通过计算漫反射光照,可以为3D场景中的物体添加真实的光照效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.在UnityShader中实现逐顶点漫反射光照模型

计算公式:
漫反射光照 = 光源颜色与强度 * 漫反射颜色 * saturate(dot(法线方向,光照方向));

Shader "Unity Shaders Book/Chapter 6/Diffuse Vertex-Level"
{
	Properties
	{
	     //定义属性,控制材质的漫反射颜色
		_Diffuse ("Diffuse", Color)=(1,1,1,1)
	}
	SubShader
	{
		Pass
		{
		    //指明该Pass的光照模式
		    Tags{"LightMode"="ForwardBase"}
		    
			CGPROGRAM

			//告诉Unity我们定义的定点着色器和片远着色器的名字
			#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;
				//将顶点坐标从模型坐标转换为裁剪坐标
				o.pos = UnityObjectToClipPos(v.vertex);

				//获取环境光
				fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;
				//将法线从模型空间转到世界空间(光源方向和法线必须处在同一坐标空间下)
				//截取变换矩阵的前三行前三列,使用其逆矩阵即调换mul函数中的位置,最后归一化
				fixed3 worldNormal = normalize(mul(v.normal, (float3x3)_World2Object));
				//获取世界空间中的光源方向
				fixed3 worldLight = normalize(_WorldSpaceLightPos0.xyz);
				//漫反射光照=(光源颜色与强度信息*漫反射颜色)max(0,dot(顶点法线,光源方向);)
				fixed3 diffuse = _LightColor0.rgb * _Diffuse.rgb * saturate(dot(worldNormal, worldLight));
				o.color = ambient + diffuse;
				return o;
			}
			
			fixed4 frag (v2f i) : SV_Target
			{
			       //输出顶点
	                        return fixed4(i.color,1.0);
			}
			ENDCG
		}
	}
	Fallback "Diffuse"
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值