基础光照上篇主要讲的是unity中的光照模型及其原理,还有几种光照类型(自发光、环境光、漫反射、高光反射),后面几篇文章就开始在unity中实现这几种光照类型,本篇在unity实现漫反射。
一、在unity shader中实现漫反射光照模型
下面我们来实现光照模型中的漫反射光照部分,计算公式如下:
基本光照模型中漫反射部分的计算公式:
Cdiffuse=(Clight · mdiffuse)∗max(0,n^ · l^)
要计算漫反射需要4个参数:
Clight = 入射光线的颜色和强度
mdiffuse = 材质的漫反射系数
n^ = 表面法线
l^ = 光源方向
为了防止点积结果为负值,我们需要使用max操作,而Cg提供了这样的函数。在本例中使用Cg的另一个函数可以达到统一的目的,即saturate函数。
函数:saturate(x)
参数x用于操作的标量或矢量,可以是float、float2、float3等类型。把x截取在[0,1]范围内,如果x是一个矢量。那么会对它的每一个分量进行这样的操作。
1.1实践:逐顶点光照
我们看一下如何实现一个逐顶点的漫反射光照效果。
1.为了得到并控制材质漫反射颜色,首先在shader中声明属性漫反射颜色,设置初始值白色:
Properties {
_Diffuse ("Diffuse", Color) = (1, 1, 1, 1)
}
2.然后在subshader语句块定义了一个pass,指明光照模式:
Pass {
Tags { "LightMode"="ForwardBase" }
LightMode标签是Pass标签中的一种,它用于定义该Pass在unity光照流水线的角色,定义了正确的LightMode,才能得到一些untiy的内置光照变量,例如后面要说的_LightColor0。
3.声明指令,包含内置文件Light.cginc,定义变量:
#pragma vertex vert
#pragma fragment frag
#include "Lighting.cginc