shader入门精要:基本漫反射光照模型(逐像素)(笔记4)

本文介绍了一个Unity中的Shader示例,详细展示了如何使用CGPROGRAM编写顶点和片段着色器来实现基本的光照效果,包括环境光、漫反射计算,并传递世界空间法线。

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

shader"Book/Diffuse Pixel-Level"
{
	properties
	{
		_Diffuse("Diffuse",color) = (1,1,1,1)  //properties里面语句不需要分号结束
	}
		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;
				float3 worldNormal:TEXCOORD0;
			};

			v2f vert(a2v v)//顶点着色器不需要计算光照,只需要把世界空间法线传递给片元
			{
				v2f o;
				o.pos = UnityObjectToClipPos(v.vertex);
				//有几种写法
				//等价于o.worldNormal = UnityObjectToWorldNormal(v.normal);
				////等价于o.worldNormal=mul((float3x3)unity_ObjectToWorld,v.normal);
				o.worldNormal = mul(v.normal, (float3x3)unity_WorldToObject);//传递世界空间法线
				
				return o;

			}
				fixed4 frag(v2f i):SV_Target
				{
				fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;//LIGHTMODEL,获得环境光信息
				fixed3 worldNormal = normalize(i.worldNormal);//归一化法线
				fixed3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz);//归一化世界空间灯光方向
				//获得光源方向,这种获得光源方向不具有通用性,比较局限,仅仅局限于只有一盏平行光,且只有一个
				//光源情况下
				fixed3 diffuse = _LightColor0.rgb*_Diffuse.rgb*saturate(dot(worldNormal, worldLightDir));
				//漫反射公式
				fixed3 color = ambient + diffuse;
					return fixed4(color,1.0);
				
				}
				
					ENDCG
	     }
	
	}
		Fallback"Diffuse"
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值