游戏引擎之:渲染(shading)

http://blog.csdn.net/houdy/archive/2004/10/31/160722.aspx

整个渲染过程应该分为两个大的部分:
  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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值