UnityShader入门精要笔记(5)——Unity中的基础光照

Unity中的基础光照

一、一些基础定义

  • 着色:根据材质属性(如漫反射属性等)、光源信息(如光源方向、辐照度等),使用一个等式去计算沿某个观察方向的出射度的过程。这个等式称为光照模型。
  • 高光反射:表示物体表面是如何反射光线的
  • 漫反射:表示有多少光线会被折射、吸收和散射出表面。
  • 将进入摄像机的光线分为4个部分(C为符号,后面的小写单词为下标):
    • 自发光(emissive)部分:用Cmissive来表示。用于描述当给定一个方向时,一个表面本身会向该方向发射多少辐射量。需要注意的是,如果没有使用全局光照(global illumination)技术,这些自发光的表面并不会真的照亮周围的物体,而是它本身看起来更亮了而已。
    • 高光反射(specular)部分:用Cspecular来表示。用于描述当光线从光源照射到模型表面时,该表面会在完全镜面反射方向散射多少辐射量。
    • 漫反射(diffuse)部分:用Cdiffuse来表示。用于描述当光线从光源照射到模型表面时,该表面会向每个方向散射多少辐射量。
    • 环境光(ambient)部分:用Cambient来表示。用于描述其他所有的间接光照。
  • saturate(x) 函数:把x截取在[0,1]范围内,如果x是一个矢量,那么会对它的每一个分量进行这样的操作。x为矢量或者标量,可以是float、float2、float3等类型。

二、基本光照模型中的各个部分的计算公式

1、漫反射部分:Cdiffuse = (Clight * mdiffuse)max(0,n * I)

参数说明:

  • Clight:入射光线的颜色和强度
  • mdiffuse:材质的漫反射系数
  • n:表面法线
  • I:光源方向
  • max()操作:saturate函数

用于解决背光面全暗的模型,半兰伯特模型:Cdiffuse=(Clight * mdiffuse)(α(n * I)+β)

半兰伯特光照模型没有使用max操作来防止nI的点积为负值,而是对其结果进行了一个α倍的操作再加上一个β大小的位移。绝大多数情况下,α和β的值均为0.5。所以公式为C**diffuse=(Clight * mdiffuse)(0.5(n * I)+0.5)
通过这样的方式,将***n*** * I的结果范围从[-1,1]映射到[0,1]范围内。

2、高光反射部分:Cspecular=( Clight * mspecular)max(0,v * r)mglass

参数说明:

  • Clight:入射光的颜色和强度
  • mspecular:材质的高光反射系数
  • v:视角方向
  • r:反射方向,可以由表面法线**n和光源方向I计算得来:r = 2(n * I)n - I。CG也提供了计算反射方向的函数reflect。reflect(In)。

另外一种高光反射模型,Blinn光照模型:Cspecular=(C * mspecular)max(0,n * h)mgloss

  • 没有使用反射方向,而是引入一个新的矢量***h***,通过对视角方向**V和光照方向I相加后再归一化得到的。h = (v + I)/|v+I|。

你可能感兴趣的:(Unity,unity,shader)