Surface Shading

渲染3d场景时,无论使用ray tracing还是rasterization,在实时还是在批处理中,着色是对视觉效果影响

最大的过程之一

本章描述基于点光源照射的不透明表面基本着色模型。

Point source illumination

点光源包括position,intensity

点光源有isotropic(各向同性)

the irradiance E is E = P/4PI * 1/pow(r,2)

the quantity I = P/4PI,是光强(amount of light),后者是factor

更普遍地,E = I * cos(theta) / pow(r,2),其中cos(theta) = n * l

Directional illumination

不同于点光源,由于方向光是由很远的点光源产生,这就导致I/(r^2)的占比很小,这里设为一个常数H

E = H * cos(theta)

其中常量H被称为法向辐射(normal irradiance)

Basic reflection models

现在可以计算辐射度(irradiance)了,辐射量可以表示照在物体上的光的量。

1.Lambertian reflection 这是一种非常简单的模型,用于计算漫反射,光无差别反射。

L = kE

L = R/PI * E 其中R是反射的光的强度

兰伯特模型公式c = _DiffuseColor.rgb * _MainLight.rgb * max(dot(n,l),0);

半兰伯特则是点乘结果tilling 0.5,offset 0.5

2. Specular reflection

许多材质具有不同程度的亮度(shininess),例如金属光泽(metal),塑料(plastic)

光泽(gloss),半光泽(semi-gloss)

2.1最简单的高光(镜面反射)发生在完美的平滑表面,例如镜子,或者水的表面。

这种效果来源于一个点光源,点光源有具体的方向,使得表面有一个大的高光点。

2.2但是一般表面并不平滑,一般显示的效果更接近于glossy reflection.

比较知名的简单模型是BlinnPhong模型。

简化公式为specular = _SpecularColor.rgb * _BaseColor * pow(max(0,dot(n,h)),_Gloss);

其中h = normalize(l + v)

注意phong模型与BlinnPhong的区别(v*r)

一般将高光和漫反射相加统筹

生成因子k的表达式叫做双向反射分布函数(BRDF)

因为它反映了反射光随l,v两个向量的改变而改变

对于lambertian的brdf是常量(constant)

对于specular则不是。irradiance描述了光的“量”,而brdf则描述了表面如何反射光。

Caculating shading

  • 光的入射向量l = lightPosition - modelVertex

Ambient illumination

点光源是非常局部性的光源

ambient = UNITY_LIGHTMODE_AMBIENT.rgb * albedo

环境光着色是一个有点hack的手段,因为大型扩展光源发出的光是不同的,在角落和凹陷区域都会更暗一些。

但是它却是很重要的,因为它防止阴影变成完全的黑色,并且容易调整场景对比度。

一些系统把环境光看作一种点光源或平行光。还有一些系统则是让环境光Intensity成为一个场景的参数,来模拟环境光。

Frequently Asked Questions

  • Phong 模型看起来是个很大的hack操作

    yes