UnityShader(四)基础光照

一、标准光照模型

1.1 光的散射和吸收

光线从光源中发射出来后,与物体表面相交,结果通常有两个:「散射」和「吸收」。
散射只会改变光线的方向,而不改变光线的颜色和密度。吸收则相反。光线在物体表面散射后,一种会散射到物体外部,也就是「反射」;另一种会散射到物体内部,也就是「折射」。对于不透明的物体,折射入内部的光线还会继续与物体内部颗粒相交,一部分最后又会重新发射出表面。另一部分则被物体吸收。

我们在光照模型中使用「高光反射」表示物体表面如何反射光线;使用「漫反射」表示有多少光线被折射、吸收、散射出表面。

1.2 标准光照模型

标准光照模型只关心直接光照,也就是从光源发射出来照射到物体表面后,经过物体表面的一次反射直接进入摄像机的光线。
它将进入摄像机内的光线分成了四个部分,每个部分用一种方法来计算它的贡献度。它们分别是:

  • 自发光:用cemissivec_{emissive}cemissive表示,用于描述当给定一个方向时,一个表面本身会向该方向发射多少辐射量。如果没有使用全局光照技术,这些自发光的表面并不会真的照亮周围的物体,只是本身看起来更亮而已。
  • 高光反射:用cspecularc_{specular}cspecular表示,用于描述当光线照射到模型表面时,该表面会在「完全镜面反射」方向散射多少辐射量。
  • 漫反射:用cdiffusec_{diffuse}cdiffuse表示,用于描述当光线照射到模型表面时,该表面会向每个方向散射多少辐射量。
  • 环境光:用cambientc_{ambient}cambient表示,用于描述其他所有间接光照。

环境光

在标准光照模型中,环境光通常是一个全局变量gambientg_{ambient}gambient,也就是说场景中所有的物体都使用这个环境光。即
cambient=gambientc_{ambient} = g_{ambient}cambient=gambient

自发光

标准光照模型直接使用光源材质的自发光颜色memissivem_{emissive}memissive作为光源的自发光辐射量
cemissive=memissive c_{emissive} = m_{emissive} cemissive=memissive

漫反射

在漫反射中,视角的位置并不重要,因为反射是完全随机的,可以认为反射在任何方向上的分布都是一样的。但入射光线的角度很重要。

根据兰伯特定律:反射光线的强度与表面法线和光源之间夹角的余弦值成正比。我们假设nnn是表面法线,lll是指向光源的单位矢量,则cosθ=n⋅lcosθ=n·lcosθ=nl。则根据定律可得
cdiffuse=(clight⋅mdiffuse)max(0,n⋅l) c_{diffuse}=(c_{light}·m_{diffuse})max(0,n·l) cdiffuse=(clightmdiffuse)max(0,nl)
其中mdiffusem_{diffuse}mdiffu

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值