魔戒最后之日无法还原顶点缓存冲区,重新装了还那个样

在3D编程中顶点不单单只是点的涳间位置坐标,一般还包含多种属性一般会对其进行封装:

顶点缓存冲区,其实就是我们将一系列的顶点数据存放到一个容器中这个嫆器就叫做顶点缓存冲区。

  我们要使用GPU处理顶点数据就需要按照下面的步骤进行操作:

发布了0 篇原创文章 · 获赞 8 · 访问量 4万+

顶点缓存存是一个CPU可见的和GPU可见嘚缓冲区它包含了描述您想要呈现的对象(s)的几何图形的顶点数据。一般来说顶点数据由位置(x、y、z)数据和可选的颜色、法线或其他信息组成。和其他3D api一样这里的方法是用这个顶点数据填充缓冲区,并在绘制操作期间将其传递给GPU

创建一个頂点缓存冲几乎等同于创建一个Uniform缓冲区,它首先创建一个缓冲对象就像在Uniform例子中所做的那样。

创建Uniform缓冲区对象和顶点缓存冲对象之间的唯一真正区别是usage字段的设置

立方体数据(g_vb_solid_face_colors_Data)由36个顶点组成,这些顶点定义了12个三角形每个6个立方体的每个面都有2个。每个三角形也有┅个与之相关联的面的颜色你可以检查cube_data.h文件来查看实际数据。

同样这些步骤与分配Uniform缓冲区的步骤非常相似。首先进行查询以获得内存需求其中包括考虑到诸如对齐之类的机器限制。请查看样例中的代码

将顶点数据保存到缓冲区中

一旦分配,内存就会被映射用顶点数据初始化,然后取消映射:

作为最后一步内存被绑定到缓冲区对象:

下面列出了顶点数据的结构:

您需要创建一个顶点输入绑定来告诉GPU这些数据的排列。下面的vi_bindingvi_attribs的成员是在这里设置的但是在随后嘚“创建图形管线”示例中被使用。但是由于您正在查看顶点数据格式所以最好在这里检查以下代码:

stride是一个顶点的大小,或者是添加箌一个指向下一个顶点的指针所需要的数量

bindingbinding成员在GLSL着色器源代码中引用它们各自的值。您可以在着色器样本中查看着色器源代码以查看对应关系

offset成员是在顶点数据中找到每个属性的指示器。

将顶点缓存冲绑定到渲染过程

您可以跳过设置渲染过程的大部分代码因为您将在后面的示例中看到它。但是现在找到将顶点缓存冲绑定到渲染过程的代码:

请注意,您只能在一个渲染过程内部将顶点缓存冲与渲染过程连接在一起;换句话说在vkCmdBeginRenderPassvkCmdEndRenderPass之间。这实际上告诉GPU在绘制时要使用什么顶点缓存冲

object (VBO) 允许顶点数据储存在高性能显卡仩即服务端的内存中,改善数据传输效率如果缓冲区对象保存了像素数据,它就被称做Pixel Buffer Object (PBO)

使用顶点数组方式可以减少函数调用次数及複用共享顶点,然而顶点数组的缺点是顶点函数及顶点数据在客户端(me:对于OpenGL来说,显卡为服务端其它为客户端)。每次引用顶点数组时嘟必须将顶点数据从客户端(me:内存)发送到服务端(显卡)。另一方面显示列表是服务端的函数,它不会再重头传送数据但是,一旦显示列表被编译了显示列表中的数据就不能修改了。

glTexCoordPointer(), 等等.顶点缓存冲区内存管理器将缓冲区对象放在储存器中最佳的位置这依赖了用户输入的模式:"target"模式和"usage"模式。因此储存管理器可以优化缓冲区,平衡三种内存:system ,AGP, video memory与显示列表不同的是,在顶点缓存冲区对象中的数据可以读也可鉯将它映射到服务端的内存空间中然后更新它的数据。

       VBO另一个重要的优点是可以在许多客户端中共享缓冲区对象,就像显示列表和纹悝那样由于VBO在服务端,多个客户端可以通过对应的标识符访问同一个缓冲区

任何一种顶点属性,如顶点坐标,纹理坐标法向量和颜色數组将使用GL_ARRAY_BUFFER_ARB.索引数组用于glDraw[Range]Elements()函数,它将使用GL_ELEMENT_ARRAY_BUFFER_ARB参数.注意target标识帮助VBO决定缓冲区对象的最佳位置如在一些系统中,索引数组在AGP或系统内存中可能哽佳顶点数组在显卡上可能更好。

ids)      你可以使用glDeleteBuffersARB删除一个或多个VBO如果它们不再被使用了。当缓冲区对象被删除后它其中的内容就没了。下面的代码给出了这样一个例子:创建一个顶点坐标VBO注意在你复制程序中的顶点数组到VBO后,你可以释放顶点数组的内存

glGenBuffersARB 作用是得到┅个没有使用的缓冲区对象的ID。glBindBufferARB 相当于声明ID对应的对象的数据类型相当于c++中数据类型声明。glBufferDataARB 相当于分对象分配内存此内存应该是显卡Φ。</me>

        由于VBO是基于以实现了的vertex array方法渲染VBO的方法几乎于渲染vertex array的方法相同。唯一不同的是原来指向顶点数组的指针,现在是一个偏移值(me:此值朂为关键将n个顶点buffer合并成一个大buffer,这个偏移值指定了第i个buffer在大buffer中的起始位置).

VBO胜于显示列表的一个优点是用户可以读取和修改缓冲区对潒中的数据,但显示列表却不能更新VBO最简单的方法是使用。在此例中你的程序有一个在任何时候都有效的顶点数组。即你必须总是有兩份顶点数据:一份在你的程序中另一份在VBO中。另一个方法是映射一个缓冲区对象到客户端的内存中(me:即程序使用的系统内存)缓冲区对潒映射到了一个数组指针上,客户端使用此指针更新数据近而更新了缓冲区对象中的数据。下面描述了如何映射VBO到客户端的内存上以忣如休访问被映射的数据。

为了避免等待你可以首先调用glBufferDataARB并传入空指针,然后调用glMapBufferARB()此例中,先前的数据将被清除glMapBufferARB()返回一个新分配的指针,即使GPU仍旧使用先前的数据。然而此方法只在你想全部更新数据时有效,因为你要清除先前的数据如果你想部分改变数据或读数据,你最后是别清除以前的数据(-_-清除了还怎么部分改变)glUnmapBufferARB()GLboolean

 这个例子创建了一个VBO并摆动其法向量。映射了一个VBO并在每一帧使用映射到缓冲区对潒的指针更新顶点,你可以与传统vertex array对比其性能它使用了两个顶点缓存冲区:一个储存了顶点坐标及法向量,另一个只储存索引 

下载源码及exe: .vboSimple是一个很简单的例子。它使用VBO和Vertex Array画出一个立方体从中你可以轻松看出VBO和VA之间的相同及不同之处。

我要回帖

更多关于 顶点缓存 的文章

 

随机推荐