Computer Graphics 04
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