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

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

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


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

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

一个应用于(uv)的简单公式

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

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

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

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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值