今天看了国外一个人录制的一系列的视频,介绍图形渲染的一些基础知识。关于Triangle Mesh,Fragment Shader等等。讲的浅显易懂。不过就是在youtube。但是我想说,这墙值得一翻……
http://www.youtube.com/user/BSVino
后来还看了一篇文章,写的也很好。讲图形渲染管线的。
http://www.gamedev.net/page/resources/_/technical/graphics-programming-and-theory/introduction-to-the-graphics-pipeline-r3344
其实呢,是想把这些东西好好梳理一下写下来,但是要下班了……再议。
今天有时间,就稍微总结一下吧。其实感觉应该配点图啥的……再议。
- Shader
在3D游戏中,各种显示在屏幕的图形都是由一个个Triangle绘制得到的。每个Triangle呢,除了三个Vector记录顶点坐标,还包括它用到的Texture,Normals和UV信息。我们在游戏中看到的各种图形,都是由一个个Triangle和它相关的这些信息构成的。这就是渲染的最基础的数据。
计算机通过使用Shader程序根据上面这些信息,将正确颜色的像素点渲染到屏幕上。Shader可以分为Vertex Shader和Fragment Shader。渲染图形管线那篇文章,讲了这两种Shader的区别和它们应用的不同阶段。这里主要讲的是Fragment Shader。它是在将Triangle像素化(Rasterization)后,对这些像素点(可以理解为完整的三角形被打散成的“Fragment”)的处理。根据我的理解,此时就会使用Texture,Normals和UV信息来计算出应该写入Double-buffered Framebuffer的颜色数据。
- Normals & Lambertian Surface
每一个Triangle还记录法线信息,即Normal。它是向量AB与向量BC叉乘的结果。根据数学定义,这个结果是一个垂直于该三角面的向量。方向由右手法则决定。通常都将它标准化。
Normal有啥用呢?最重要的用途就是光照。根据Lambertian Cosine Law,物体表面的光照强度与入射光的反向向量与Normal的余弦值正相关。只适用于方向光(Directional Light)。具体的公式,视频里并未给出,估计也比较麻烦。。。而通过入射光的反向向量与Normal的点积结果,可以得到余弦值。这样图就可以将这些数据提交给图形API,进行图像的绘制。
一些3D模型除了纹理的贴图还包括法线贴图,是为了能更好地表现纹理细节。某一些纹理,例如岩石的表面,是凹凸不平的。可以通过记录每一个像素点的Normal来从某种程度上记录它的凹凸感。这比为每一个凹凸点绘制三角面要划算。那么法线贴图是如何应用的呢?首先,需要一些准备工作。
法线贴图记录的是R,G,B的颜色值,它们的变化区间是[0, 1]。而Normal的x,y,z值的变化区间是[-1,1]。这就需要做一个值的映射。
然后法线贴图是位于它自己的xy坐标空间,而一个模型身上的每一个三角面是由它的Normal决定的空间中的平面。这就还需要一个坐标系的转换。
这些准备工作都做好以后,光照效果就不会一刀切地应用到整个Triangle上,而是根据每个点的法线贴图的Normal来计算。于是,一些纹理的细节就很好地表现出来了。
- Specularity
对于一些具有高光效果的材质(光亮的金属面),也可以利用Normal计算余弦值。不同的是,这里的余弦值是反射光与视线的夹角的余弦值。所以这个值是随着视角变化的。因此你从不同角度观察一个高光的材质光亮的区域不一样。将这个值与前面用法线与入射光的余弦值叠加,就可以计算出材质表面实际的光照效果。
有时材质的不同区域的高光效果也会不一样,因此可能还需要一张高光贴图来记录这些信息。
- Fog
这个视频介绍了一种使用Shader实现雾的效果的方法。造成雾的效果的原因,主要是由于空气中颗粒对光线传播的影响。空气中颗粒浓度越高,距离观察的物体越远,雾就越明显。因此可以将一种颜色值(雾的颜色)与模型的贴图颜色进行加权叠加。雾的浓度越高,雾的颜色的权值越高。
- Vertex Buffer & Indexed Triangle Meshes
在进行图形的渲染前,需要将模型的所有定点信息提交给图形API。这是一个进行顶点缓存的过程。根据前面所述,三角面的法线向量是根据三角面的边计算的。所以除了顶点外,还需要提交哪三个顶点构成三角形的信息。这样,其实只要将顶点按照正确顺序提交就可以了。图形API会知道,第一第二个顶点构成第一条边,第二第三个顶点构成第二条边,再计算出法线向量。但是,三角面有过多的顶点是重合的,几乎每一个顶点的提交都会有重复。所以可以只提交顶点信息。三角形的信息只提交对顶点的索引。这样就避免了空间的浪费。
以上是我看这个系列视频的一些收获和总结吧。写的不对的地方,欢迎拍砖~~