3D引擎数据结构与glTF(3): Mesh

本文探讨3D空间中物体表示的边界表示法,重点介绍Mesh的概念,包括顶点缓冲的内存布局、Vertex Cache优化、顶点法线以及glTF中Mesh的数据组织。文章还提及了在场景节点中引用Mesh的方式,以及为何使用DrawElements方式能提高GPU绘制效率。
摘要由CSDN通过智能技术生成

在上一篇文章中我们介绍了场景中对象之间的层次关系,接下来我们就探讨单个物体在三维空间中的表示。

要渲染三维空间中的物体,首先就要在三维空间中表示物体的造型。目前图形学中最常用的方法叫做“边界表示法( Boundary Representation )”,即用一组多边形或者曲面来定义物体的边界,它们可以区分了空间中哪些部分是物体的内部,哪些是物体的外部。其中使用多边形的方式更通用一些,构造一个物体边界的一组多边形就被称为“ Mesh ”。 在这里我们先讨论静态 mesh,也就是自身不发生形变的 mesh ,glTF 也支持蒙皮和骨骼动画,我们后面再讲。

也许现在三角形太流行了,大家可能不习惯了使用多边形。实际上,现在建模软件还在大量使用多边形,最后这些模型导入 3D 引擎的时候会再进行三角形化( triangularization )。三角形的流行是在 GPU 兴起之后的事儿,因为三角形更有利于硬件去实现和优化。在早期的 3D 游戏中,例如 Quake 使用软件渲染,它使用凸多边形。在 OpenGL 早期的 API 版本中也有对多边形的支持: glBegin() 支持 GL_POLYGON 模式,而在3.0以后版本的 OpenGL API 中已经不再支持了,下面我们讨论的 Mesh 也就使用三角形模式了。

Mesh 的数据组织

OpenGL 或者其他图形 API 都普遍支持下面这三种三角形 Mesh 的拓扑结构:

  • Triangle List:每三个顶点组成一个三角形
  • Triangle Strip:每增加一个顶点,和前面的两个顶点组成一个三角形(共享前面两个顶点)
  • Triangle Fan:每增加两个顶点,与第0个顶点组成一个三角形(共享第0个顶点)

OpenGL 支持两种向 GPU 提交 Mesh 数据的方式:

  • DrawArrays 方式
    把 Mesh 中的三角形的所有顶点数据,按照上面那三种方式之一排列形成一个顶点数组,就可以让 GPU 去绘制所有这些三角形了。

  • DrawElements 方式
    在一个 Mesh 中很多三角形是互相连接在一起的,具体的说,两个三角形会共用一条边,那么这条边上的两个顶点则可以共享。为了共享顶点,就需要引入“顶点索引”。(做实时渲染的人最抠门了,各种省:joy:)。把所有的顶点放在一个数组中,然后另外使用一个 index buffer 通过数

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值