游戏引擎之:渲染(shading)

原创 2004年10月31日 09:57:00

整个渲染过程应该分为两个大的部分:
  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: jerrydong@tom.com

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

目前游戏行业内部主要几款游戏引擎的技术对比

如果只有客户端的话,可以考虑用gamebryo,技术好一点,用ogre也可以,如果规模不大,用unity3d,如果很有钱,要效果很好的,用unreal3,bigworld是带服务器的,如果能力不够,最...
  • pizi0475
  • pizi0475
  • 2011年06月17日 11:29
  • 67507

国内做 3D 渲染和游戏引擎的码农们都在哪里获取技术信息?

国内做 3D 渲染和游戏引擎的码农们都在哪里获取技术信息? 国内的做 3D 渲染,图形有关的码农们,主要都是去哪里获取技术帮助呢?尤其是移动这边。 现在公司里主要任务就是在 iOS 上...
  • pizi0475
  • pizi0475
  • 2015年11月02日 20:15
  • 2040

游戏引擎之:渲染(shading)

整个渲染过程应该分为两个大的部分:  1) material synthesis(材质综合),包括纹理和表面属性。  2) illumination(光照),包括各种光照模型和渲染模型。在这里主要涉及...
  • houdy
  • houdy
  • 2004年10月31日 09:57
  • 4078

游戏引擎中三大及时光照渲染方法介绍(以unity3d为例)

重要:在目前市面上常见的游戏引擎中,主要采用以下三种灯光实现方式:顶点照明渲染路径细节 Vertex Lit Rendering Path Details正向渲染路径细节 Forward Render...
  • Kaitiren
  • Kaitiren
  • 2016年03月01日 11:09
  • 2194

游戏引擎之:渲染(shading)

http://blog.csdn.net/houdy/archive/2004/10/31/160722.aspx整个渲染过程应该分为两个大的部分:   1) material synthesi...
  • jinlking
  • jinlking
  • 2010年06月25日 23:52
  • 2020

卡通渲染(Toon Shading/Cel Shading)

    卡通渲染(Catoon Rendering/Toon Shading/Cel Shading)是NPR技术中的一种。 下面是老外关于卡通渲染的定义:    Cel shading is a f...
  • skyman_2001
  • skyman_2001
  • 2006年09月10日 17:13
  • 4676

3D游戏引擎渲染内核架构及其技术

  • 2013年04月10日 15:46
  • 455KB
  • 下载

几款游戏引擎技术对比

如果只有客户端的话,可以考虑用gamebryo,技术好一点,用ogre也可以,如果规模不大,用unity3d,如果很有钱,要效果很好的,用unreal3,bigworld是带服务器的,如果能力不够,最...
  • debugconsole
  • debugconsole
  • 2014年06月13日 00:57
  • 4363

matlab函数——shading函数

函数说明: 是阴影函数控制曲面和图形对象的颜色着色,即用来处理色彩效果的,包括以下三种形式: shading faceted:默认模式,在曲面或图形对象上叠加黑色的网格线; shadin...
  • qq_27561265
  • qq_27561265
  • 2015年09月07日 16:32
  • 4066

《游戏引擎架构》 笔记(一)

博客搬家自http://zhouyuanchao.com/wordpress/archives/41 游戏团队:工程师、艺术家、游戏设计师、制作人 平台游戏(platformer)...
  • yjwx0018
  • yjwx0018
  • 2016年08月26日 00:05
  • 2571
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:游戏引擎之:渲染(shading)
举报原因:
原因补充:

(最多只允许输入30个字)