0

OpenGL/OpenGLES VBO 是否只保存相同大小的顶点?

我之所以问,是因为我发现 glDrawElements 的参数仅具有索引缓冲区的偏移值(它的最后一个参数),这意味着: 1. 如果缓冲区已经部分填充,我必须在将它们提交给 IBO 之前手动偏移我的索引。无论如何,手动偏移索引很容易,所以这里不是问题。2. 用作顶点缓冲区的 VBO 必须拥有相同大小的顶点,否则索引无意义。

这种行为与 DirectX Vertex Buffer 不同,在 directx 中,有一个 SetStreamSource,可用于偏移 Verterx Buffer,以及 DrawIndexedPrimitive,您的 VB 可以保存任意大小的顶点。

也许 OpenGLES 1.1 版本的 SetStreamSource 不可用?也许 OpenGLES 2.0 会支持它?

我的目标平台是 iPhone OpenGLES 1.1,所以如果 GL 版本 SetStreamSource 不可用,我将放弃使用 VBO,因为:1. 它带来了更多麻烦(我将不得不分配许多持有不同大小顶点的 VBO) 2. 有无论如何都没有性能改进(OpenGLES 1.1 中没有硬件支持)

感谢您的阅读,非常感谢您分享有关在 OpenGLES 1.1 中使用 VBO 的正确方法的经验。谢谢。

4

2 回答 2

1

OpenGL 缓冲区对象(VBO 是使用模式之一)可以包含任意信息。但是绘图函数(如glDrawElements)处理相同格式的顶点信息的连续数组(显然,每个顶点占用相同的大小)。如果那是您要询问的尺寸-那么我不知道如何更改它。

如果您想使用特定偏移量的 VBO(例如,包含不同格式的顶点) - 那么最后一个参数glVertexAttribPointer适合您。当绑定 VBO 时,最后一个参数是用于顶点属性的数据段的字节偏移量。

于 2011-06-13T12:08:38.023 回答
1

当您说您有不同大小的顶点时,我不确定我是否完全理解您的意思。但是 OpenGL 可以处理 D3D 可以处理的任何顶点格式。

OpenGL 没有的是顶点“流”的概念。那是因为它不需要它们;将每个单独的属性(位置、法线、颜色等)视为一个单独的流。但它们都可以来自同一个缓冲区,并且它们都可以相互交织。

缓冲区对象的工作方式非常简单。缓冲区对象只是由 OpenGL 控制的一块大小的内存。您可以在其中放入您想要的任何字节。

要告诉 OpenGL 如何从中获取顶点数据,您必须定义许多数组,每个数组都与一个属性相关联。用于此的函数是 glVertexPointer、glNormalPointer 等;它们都是 gl*Pointer 的形式。你似乎已经掌握了那么多。

你可能不明白的是,这些函数定义的顶点格式并不是与缓冲区对象永久关联的。例如,您可以使用带有字节颜色的 3D 位置,所有这些都来自同一个缓冲区对象:

glBindBuffer(GL_ARRAY_BUFFER, bufferObject);
glEnableClientState(GL_VERTEX_ARRAY);   //Our vertices contain positions.
glVertexPointer(3, GL_FLOAT, 16, (void*)0);  //The last parameter is the byte offset from the beginning of the buffer to where the data starts.
glEnableClientState(GL_COLOR_ARRAY);    //Our vertices contain colors.
glColorPointer(4, GL_UNSIGNED_BYTE, 16, (void*)12); //Offset must add in the 3 floats from the vertex.
//Draw stuff.

稍后,您可以重新定义此指针,根据需要更改格式。这一次,我们使用 2D 位置,定义为短裤,完全没有颜色:

glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(2, GL_SHORT, 4, (void*)1024);
glDisableClientState(GL_COLOR_ARRAY);  //Our vertices contain no colors.
//Draw stuff.

这些调用之间的缓冲区绑定未更改。这个新数组从缓冲区的开头开始 1024 个字节。因此,您可以将多个对象的数据放在同一个缓冲区中。

现在,OpenGL ES 1.1 没有提供 D3D 提供的一件事。当您调用 DrawIndexedPrimitives 时,您可以在从数组中获取顶点之前提供一个添加到每个索引的偏移量。Desktop OpenGL 3.2 及更高版本提供此功能(以及通过扩展的较低版本),但不提供 ES 1.1。

于 2011-06-13T12:13:58.133 回答