游戏引擎之:渲染(shading)

整个渲染过程应该分为两个大的部分:
  1) material synthesis(材质综合),包括纹理和表面属性。
  2) illumination(光照),包括各种光照模型和渲染模型。
在这里主要涉及到的内容是illumination。
在OpenGL中,若需要计算光照模型(light model),就需要在指定顶点(vertex)的时候,为顶点添加两个属性:
1) 顶点的颜色;
2) 顶点出的法向向量;
这两个属性的值直接参与光照模型的计算公式中。下面就顺便提一下如何计算顶点处的法向向量:
首先计算任意一个三角平面的法向量。可以通过三角形平面中三个顶点的坐标计算出这个面的法向量:
         A _
          |  _  
           |   _
            |    _
             C---B

上面画的三角形的三个顶点是以顺时针顺序排列的,与之对应的是左手坐标系。在OpenGL中采用的左手坐标系,而在Direct3D采用的是右手坐标系。根据三个顶点计算三角形面法向量的计算公式是:
     normal=cross( (B-A), (C-A) )
在单个三角形平面中,三个顶点处的法向量就是此平面的法向量,但是很多情况下,几何体的一个顶点被多个平面共享,那顶点的法向量如何处理呢?一般情况下,我们通过计算共有该点的所有的三角形平面的法向量的平均值而获得。计算公式是:
       normal=cross( (B-A), (C-A) );  //注意这里结果并没有归一化
       N=( N1+N2+...+Nk )/||(N1+N2+...+Nk)||; 
这种处理方法是基于这样的实事:两个向量的叉积于这两个向量所形成的三角形的面积成正比.可以看出,三角形的面积越大,则对该顶点法向量的影响也越大,相当于对三角形法向量根据它们的面积做加权平均。

一个几何物体上每一点最终的渲染结果由多种因素共同作用的结果,这些因素包括:
1)顶点的颜色(Vertex Color);
2)纹理贴图(Texture Mapping);
3)光照模型(Illumination Model);
顶点颜色和纹理贴图之间的相互作用,或者纹理贴图之间的相互作用决定了物体真实的颜色。而物体真实的颜色和光照模型的相互作用,决定了最终的渲染结果。
其中的光照模型可以分为以下几种模型:
1)环境光(Ambient Light);   
2)漫反射(Diffuse Reflection);
3)镜面反射(Specular Reflection);
具体的计算公式可以参见参考文献。

渲染模型(Shading Model)
下面介绍的是一些常见的渲染模型:
1) 首先,最简单的Shading Model就是Constant Shading了。在这个模型中,每个三角形平面上我们应用光照计算公式一次,用计算结果渲染整个三角形平面。在OpenGL中,可以通过函数glEnable(GL_FLAT)指定当前的渲染模型是Constant Shading.
2) 接着就是Gouraud Shading,属于插值渲染的一种。在这种模型中,在三角形平面中的三个顶点处分别应用光照计算公式,计算出的结果称为vertex intensities。接着用Vertex intensities沿着边界和扫描线的插值来渲染整个三角形平面。在OpenGL中,可以通过函数glEnable(GL_SMOOTH)指定当前的渲染模型是Gouraud Shading。
3) 接着就是比较复杂的Phong Shading。在这个模型中,三角形平面上三个顶点的法向量首先在整个平面上进行插值,这个平面上每一个象素点都有一个属于自己的法向量,然后在每个象素点上应用光照计算公式,计算出的值用来渲染三角形平面。与Phong Shading类似有Blin Shading,它们两个的区别仅仅在于计算镜面反射光的公式上有所不同,Blin模型的效率要高于Phong模型的效率。这个渲染模型OpenGL并不直接支持,需要能够进行Pre-Pixel Shading的显卡的硬件支持。

凸凹贴图(Bump Mapping)
Bump Mapping是一种纹理贴图技术,但是它和光照模型和渲染模型结合的比较紧。在Phong模型中,三角形平面上的每个象素点的法向量是通过顶点法向量插值计算获得的,但是在Bump Mapping中,每个象素点的法向量是通过一种叫做Normal Map的纹理图案获得的。值得注意的是,Normal Map中并不是保存每个象素点的法向量,而是相对于向量<0,0,1>的扰动量。Normal Map的获得是通过纹理图案的Hieght Map获得的,这样就真实的反映了贴图表面的凸凹特性。Bump Mapping中其他的过程和Phong的过程一致。
由于Normal Map中保存的是相对于<0,0,1>的扰动量,所以有需要将它于光亮公式中经常使用的插值法向量相对应。这可以通过在每个顶点位置构造一个坐标系来实现,在该坐标系中顶点法向量总是指向z轴正方向。出了法向量,在每个顶点位置还需要两个于表面相切的向量,这两个向量形成正交基。这样就形成的坐标系统称为切线空间。在具体计算的时候,需要将光线向量转转到这个切线空间内。

参考文献
1.《3D游戏于计算机图形学中的数学方法》,Eric Lengyel著,清华大学出版社。
注:这本书真的很好,强烈推荐,看了以后有茅塞顿开的感觉。

2.《计算机图像学原理和实践-C语言描叙,第二版》,Foley等著,机械工业出版社
注:计算机图像学领域的Bible。

-----------------------------致力于多媒体技术,成为有思想的软件工程师------------------------

此文章为我原创作品,若要转载,请和本人联系,或注明出处。
欢迎大家对文章内容提出宝贵意见,同时希望大家及时指出文中的错误之处,这样我可以及时更正。
我的联系方式:
QQ: 7578420
Email: [email protected]

----------------------------------------------------------------------------------------

你可能感兴趣的:(计算机图形学)