在计算光照模型时,通常来讲会有两种:在顶点着色器中计算的称为逐顶点光照;在片元着色器中计算的被称为逐像素光照,我们先讲逐顶点光照。
逐顶点光照也被称为高洛德着色,我们在每个顶点上计算光照,然后会在渲染图元内部进行线性插值,最后输出成像素颜色。由于顶点数目往往远小于像素数目,因此逐顶点光照的计算量往往要小于逐像素光照。但是由于逐顶点光照依赖于线性插值来得到像素光照,因此当光照模型中有非线性的计算(如计算高光反射时),逐顶点光照就会出现问题。且逐顶点光照会在渲染图元内部对顶点颜色进行插值,会导致渲染图源内部的颜色总是暗于顶点处的最高颜色值,这在某些情况下会产生明显的棱角现象。
在Unity Shader中实现漫反射光照模型,计算公式:
为了防止点积结果为负值,我们需要使用max操作,在CG中提供了saturate(x)函数能达到同样的效果。
Shader "Unlit/Diffuse Vertex-Level" {
Properties {
//声明一个Color类型的属性,初始值设为白色
_Diffuse ("Diffuse", Color) = (1, 1, 1, 1)
}
SubShader {
Pass {
//设置光照模式,只有定义正确的光照模式才能得到Unity的内置光照变量
Tags { "LightMode"="Forward