复习下光照知识

光照模型将自然界的光照分为几个分量, 环境光, 漫反射光, 镜面光, 放射光.

环境光(ambient light)描述的是在环境中进行充分的散射, 似乎来自所有方向的光. 环境光撞击物体表面时, 会向所有方向均匀发散. ambient light = ambient light * ambient material 即RGB of ambient light = (R1R2, G1G2, B1B2).

漫反射光(diffuse)描述的自光源发射出后撞击到物体不光滑表面并均匀散射到各个方向的光, 因此和观察者位置无关. 根据Lambert定律, diffuse color正比于法线n和光向量l的余弦, 当n和l被normalize后, 余弦值等于n.l . 但是当入射角度大于PI/2时, (即在背面入射) 漫反射光为0, 加上材质和光颜色的影响. diffuse color = max(n.l , 0) * diffuse light * diffuse material.

镜面光(specular)描述的光照在光滑表面产生高光出现闪闪发光的效果. 根据Phong光照方程 specular = (r.v)shiness , r是光向量l关于法线的反射, v是表面点到视点的向量, shiness是光强度参数. r =  2 (n.l) – 1, 其中n l为单位化的法向量 光向量. 如果 n.l = 0 镜面光也为0. 镜面光还有另外的计算方式, 如Blinn提出的 specular = (n.h)shiness = (cosO)shiness ,

其中h = (l+v) / ||l+v||, 即l和v的平分线方向的单位向量. 加上材质和光颜色,  max((n.h),0)shiness * specular light * specular material. DX和OGL就是用的这个公式.

放射光(emission)描述物体的自发光, 和环境没有关系, 既不受外界光的影响也不影响其他物体. emission light = emission material.

total light = ambient light + disffuse light + specular light + emission light.


shading 处理主要有三种方法, Flat, Gouraud, Phong.

Flat shading 以三角形为单位计算颜色, 然后对三角形内的fragment填色.

Gourand shading 计算三角形每个顶点的光照, 然后通过插值计算每个像素处的光照.

Phong shading 用三角形三个顶点处的法向量通过插值的方式计算每个fragment的法向量, 然后计算每个fragment的光照值.

从上到下开销依次增大, Flat和Gourand开销差不多, 但Phong复杂的多. 当前商业引擎用Gourand最多, Gourand缺点是受模型细节层次(Detail Level)限制.每个顶点处的光照计算按照上面的方法来计算.

还有一些方法ray tracing 和 radiosity, 他们被称为global illuminationg. global illumination 和一般的著色法最大的不同点在于, shading 只考虑物件和光源之间的关系, 但是这些方法对于非光源物体间彼此的相互影响﹐只以一项固定的漫射光取代﹐以致于一些特殊的效果﹐如阴影及透明等﹐均不易表现出来.

 

REFERENCE

http://www.cs.nthu.edu.tw/~snyang/mmedia/mm_ch5.html

real time rendering

OpenGL Programming Guide

你可能感兴趣的:(复习下光照知识)