Shader理论(4):模型总结

本文深入解析Shader编程中的基本模型,包括法线、光线、视线和反射的计算。讲解了如何在Unity中获取并使用顶点坐标、法线、光源方向等变量,并结合Lambert和Phong光照模型演示了光照效果的实现。

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

前言:

本文为Shader学习的第四部分,关于shader的格式梳理。

一、基本模型

n: normal 法线方向

l: light 光线方向(该模型中为指向光源的方向而非入射方向)

v: view 视线方向

r: reflect 反射方向

二、各部分需要用到的变量

顶点坐标

(模型空间)

法线方向

normal

光源方向

light

反射方向

reflect

视线方向

view

ambient

×

×

×

×

×

diffuse

×

×

specular

 三、如何获得各部分的变量

变量

方法

说明

顶点坐标

(裁剪空间)

o.pos

UnityObjectToClipPos(v.vertex);

mul(UNITY_MATRIX_MVP, v.vertex);

将模型的顶点坐标从模型空间通过MVP变换转到裁剪空间

顶点坐标

(世界空间)

o.worldPos

mul(unity_ObjectToWorld, v.vertex).xyz;

将模型的顶点坐标从模型空间转到世界空间

法线方向

(世界空间)

o.worldNormal

UnityObjectToWorldNormal(v.normal);

将模型的法线方向从模型空间转到世界空间

光源方向

(世界空间)

worldLightDir

normalize(_WorldSpaceLightPos0.xyz);

获取世界空间下的光源方向,仅限于单个且平行光的条件下

反射方向

(世界空间)

reflect

normalize(reflect(-worldLightDir, worldNormal));

通过reflect函数和逆光源方向、世界空间下的法线方向获取

世界空间下的反射光方向

视线方向

(世界空间)

view

normalize(_WorldSpaceCameraPos.xyz - i.worldPos.xyz);

通过世界空间下的相机坐标减顶点的世界空间坐标获取视线

方向

四、汇总与合并

ambient

fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;

diffuse

fixed3 diffuse = _LightColor.rgb * _Color.rgb * Lambert;

float Lambert = saturate(n * l) = max(0, n * l);

fixed3 diffuse = _LightColor.rgb * _Diffuse.rgb * halfLambert;

float halfLambert = 0.5 * (n * l) + 0.5;

specular

fixed3 specular = _LightColor.rgb * _Specular.rgb * Phong;

float Phong = v * r;

fixed3 specular = _LightColor.rgb * _Specular.rgb * BlinnPhong;

float BlinnPhong = n * h;

h = normalize(v + l);

summary

return (ambient + diffuse + specular, 1.0);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值