【U3D/Shader】04.基础光照模型

自我介绍

广东双非一本的大三小白,计科专业,想在制作毕设前夯实基础,毕设做出一款属于自己的游戏!

标准光照模型

把进入摄像机内的光线分为4部分:

  • 自发光:emissive
  • 高光反射:specular
  • 漫反射:diffuse
  • 环境光:ambient

逐顶点/片元渲染:

  • 逐顶点渲染:也被称为高洛德着色,以来于线性插值得到像素光照,所以光照模型中有非先行计算时会出现问题(明显感到像素点,棱角现象)
  • 逐片元渲染:也被称为Phong着色,以每个像素为基础得到他的法线,然后进行计算(颜色展示更加平滑)

漫反射

兰伯特定律(Lambert’s law):反射光线的强度与表面法线和光源方向之间夹角的余弦值成正比,写成算式如下

漫反射 = (光源颜色 * 漫反射颜色) * max(0, 模型法线单位向量 * 光源单位向量)

逐顶点渲染

Shader "Unlit/005"
{
   
	Properties
	{
   
		_Diffuse("Diffuse", Color) = (1,1,1,1)
	}
	SubShader
	{
   
		Tags {
    "RenderType"="Opaque" }
		LOD 100

		Pass
		{
   
			CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag
			#include "UnityCG.cginc"
			#include "Lighting.cginc"

			fixed4 _Diffuse;

			struct v2f
			{
   
				float4 vertex : SV_POSITION;
				fixed3 color: Color;
			};

			v2f vert (appdata_base v)
			{
   
				v2f o;
				o.vertex = UnityObjectToClipPos(v.vertex);					//把顶点信息从模型空间转换到裁剪空间
				fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;				//获取环境光
				fixed3 worldNormal = UnityObjectToWorldNormal( v.normal);	//把法线信息从模型空间转换到世界空间
				fixed3 worldLight = normalize(_WorldSpaceLightPos0.xyz);	//获取世界空间下的光照方向(单位向量)
				fixed3 diffuse = _LightColor0.rgb * _Diffuse.rgb * max(0, dot(worldNormal,worldLight));	//漫反射计算
				o.color = diffuse + ambient;
				return o;
			}
			
			fixed4 frag (v2f i) : SV_Target
			{
   
				return fixed4(i.color,1);
			}
			ENDCG
		}
	}
	FallBack "Diffuse"
}

逐片元渲染

struct v2f
{
   
	float4 vertex : SV_POSITION;
	fixed3 worldNormal: TEXCOORD0;
};

v2f vert (appdata_base v)
{
   
	v2f o
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值