您的位置:首页 > 理论基础

计算机图形学之光线跟踪算法的研究与实现2017年我的优秀毕业论文

2017-06-22 11:39 465 查看
计算机图形学之光线跟踪算法的研究与实现2017年我的优秀毕业论文

版权所有使用者请联系我
刘创QQ:903188593



9 三角形网格数据构造实现

在现实世界中的大多数模型,都是由很多共享顶点的三角形所构成,正如我们前节所讲到的三角形光栅化,足以看出三角形是多么重要的模型数据。事实上,对于现代工业上经常使用到的模型如obj、off、stl、ply等文件,大部分数据都是以三角形为基元进行组合成一个非常复杂的模型。这些模型文件有最基本的顶点位置信息;有的有顶点法线信息或面的法线信息或者没有法线信息(因为面法线信息可以根据三个顶点所构成向量的叉积求得该平面的法线信息);如果该模型有纹理资源,那么该模型文件中的每一个顶点还会存储对应的uv坐标值,以供纹理插值使用;有的会附带顶点属性信息比如off模型文件等。

在本节中,我们将介绍一种管理这些模型中的数据的方案,来尽可能得降低程序内存的使用率。其中的一个简单的三角形化网格数据结构设计如图9.1。

0

1

2

3

2

1

1

0

3

图9.1一个简单的三角形化网格数据结构

注:具有三个三角形组合而成的mesh网格,共四个顶点
你可以存储这些三角形作为一个独立的实体,就如C++中的对象一样,把物体抽象出来。在该图中我们存储了点三次,其它点分别为两次,总共存储了九个点。此外,你还要为每个独立的三角形存储一个指向纹理对象的指针。当然会有一个非常高效的存储,共享顶点数据,这样的话就只用存储四个顶点和一个指向纹理的指针。

核心伪代码如下

Class triangle

Texture* t

Vector3 ,,

取而代之使用两个类

Class mesh

Texture* t

Array of Vector3 vertices

And

Class meshtriangle

Pointer to mesh meshptr

int ,,

其中,,是顶点数组对应的索引值。任何一个这样的三角形类或Mesh类都是这样工作的。那么还有空间存储更优化的Mesh类吗?典型地,一个大的模型数据中一个顶点将会被六个三角形面所共享,专业地说该点的度一般为6,这在一些大模型中就是这样,尽管也有其他值的度。这也就意味着大约两个三角形彼此有一个共享的顶点,换句话说你有n个三角形,那么就会有n
/ 2个共享顶点,以及3 * n个未共享的情况,当你共享的时候,你需要额外的3 * n个整型值和n个指针,因为你不用为每个三角形再存储纹理指针了,这样的话我们将会节省n个指针所带来的空间开销。

每个顶点会有材质参数,纹理坐标,发光系数,实际上这些参数都是为渲染模型所使用。实践中,这些参数信息将会通过三角形的双线性插值(重心填充光栅化算法),即每一个顶点插值后会得到一个重心坐标(β,γ),并且使用同样的方式将(u,
v)坐标插值到顶点。

一个应用于(u,v)的简单公式

P(β,γ) =
+ β( –)+γ * ( - ) 式9.1

u(β,γ) =
+ β(-) + γ(-) 式9.2

v (β, γ) = v0 + β(-) + γ(-) 式9.3

存储顶点的另一种数据就是顶点的法线信息。我们同样可以用这种算法插值法线坐标(u, v)来实现光滑,而不像面着色模式,这种插值法线得着色方式我们称之为Phong shading。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐