3D游戏引擎系列七

3D游戏引擎系列七

ID:37926750

大小:378.50 KB

页数:13页

时间:2019-06-02

3D游戏引擎系列七_第1页
3D游戏引擎系列七_第2页
3D游戏引擎系列七_第3页
3D游戏引擎系列七_第4页
3D游戏引擎系列七_第5页
资源描述:

《3D游戏引擎系列七》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、3D游戏引擎系列七JimBlinn在1978发表了一篇名为:“SimulationofWrinkledSurfaces”,提出了BumpMapping这个东东。BumpMapping通过一张HeightMap记录各象素点的高度信息,有了高度信息,就可以计算HeightMap中当前象素与周围象素的高度差,这个高度差就代表了各象素的坡度,用这个坡度信息去绕动法向量,得到最终法向量,用于光照计算。在前面的博客中也有介绍过高光法线时介绍过TBN,在这里利用TBN渲染Bumpmapping实现原理。GPU渲染属于可编程流水线,在使用Shader编程时首先要明白其实现原理,我们可以通过可编程

2、流水线了解一下其原理:上图中显示了TBNMatrix,T表示的是切向量,B表示次法线向量,N表示的是法线向量,这个也是求BumpMapping必须要计算得到的,TBNMatrix可以将其放到GPU中计算得到的。下面我们就一步步给读者介绍其实现,只用文字很难描述清楚,还是通过图看的比较明白。为了帮助读者理解Tangent空间向量,先给读者看一下场景中的四边形,纹理图片是要贴到四边形上的,如下图所示的效果:图中显示的是纹理坐标的关系,左下角是(0,0),右上角是(1,1)。现在,我们需要找到两个顶点的切线。“S切线”点的方向的纹理坐标,“T切线”点的方向的纹理坐标。这两个切线和法线是

3、一个顶点的“基础”。它们定义了一个坐标空间-“切向量空间”。s切线,t切线和法线分别是用x,y,z轴表示的,TBN矩阵是从物体空间转换到切线空间,矩阵的表示如下所示:(SxSySz)(TxTyTz)(NxNyNz)S也是切线空间中的一种,我们也可以将其表示为Binormal,现在的主要问题是求解S,T,N向量。先抛开GPU编程,先用C++代码实现一遍,首先定义一个类用于存储TBN,类的存储代码如下所示:[cpp]viewplaincopyclassTORUS_VERTEX{public:VECTOR3Dposition;floats,t;VECTOR3DsTangent,tTan

4、gent;VECTOR3Dnormal;VECTOR3DtangentSpaceLight;};结构体定义好了后,接下来,我们假设在场景中放置一个圆环,这个圆环有48个点组成,用于存储顶点和索引链表,代码类完整定义如下所示:[cpp]viewplaincopy#ifndefTORUS_H#defineTORUS_HclassTORUS_VERTEX{public:VECTOR3Dposition;floats,t;VECTOR3DsTangent,tTangent;VECTOR3Dnormal;VECTOR3DtangentSpaceLight;};classTORUS{publ

5、ic:TORUS();~TORUS();boolInitTorus();intnumVertices;intnumIndices;unsignedintindices;TORUS_VERTEXvertices;};constinttorusPrecision=48;#endif现在开始计算圆环的顶点位置,法线,切向量空间,首先我们把圆环在XY平面上的示例图展示如下:接下来在圆环上的材质实现法线和切向量空间的代码如下所示:[cpp]viewplaincopy在CODE上查看代码片派生到我的代码片for(inti=0;i

6、i].position=VECTOR3D(1.5f,0.0f,0.0f).GetRotatedZ(i360.0f/torusPrecision)+VECTOR3D(4.0f,0.0f,0.0f);vertices[i].s=0.0f;vertices[i].t=(float)i/torusPrecision;vertices[i].sTangent.Set(0.0f,0.0f,-1.0f);vertices[i].tTangent=VECTOR3D(0.0f,-1.0f,0.0f).GetRotatedZ(i360.0f/torusPrecision);vertices[i].n

7、ormal=vertices[i].tTangent.CrossProduct(vertices[i].sTangent);}图中实现的是静止不动的圆环,利用for循环实现了TBN向量,转动后的效果计算也是类似的,下面把完整的代码给读者展现一下:[cpp]viewplaincopy在CODE上查看代码片派生到我的代码片#include#include#include#include"Maths/Maths.h"#inclu

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。