Iphone vbo只保存相同大小的顶点?

Iphone vbo只保存相同大小的顶点?,iphone,opengl-es,vbo,Iphone,Opengl Es,Vbo,OpenGL/OpenGLES VBO是否只保存相同大小的顶点 我之所以这样问是因为我发现GLDraweElement的参数只有索引缓冲区的偏移量值(它的最后一个参数),这意味着: 1.如果缓冲区已经部分填满,我必须在将索引提交给IBO之前手动抵消索引。无论如何,手动偏移索引很容易,所以在这里不是问题。 2.用作顶点缓冲区的VBO必须保存相同大小的顶点,否则索引将毫无意义 此行为不同于DirectX顶点缓冲区,在DirectX中,有一个SetStreamSource,可用于偏移Verterx缓冲

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

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

此行为不同于DirectX顶点缓冲区,在DirectX中,有一个SetStreamSource,可用于偏移Verterx缓冲区,以及DrawIndexedPrimitive。VB可以保存任意大小的顶点

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

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

感谢阅读并分享您在OpenGLES 1.1中正确使用VBO的经验。谢谢。

OpenGL缓冲区对象(VBO是使用模式之一)可以包含任意信息。但是绘图函数(如
gldrawerelements
)处理相同格式顶点信息的连续数组(显然,每个顶点占用相同的大小)。如果你问的是这个尺寸,那么我看不出怎么能改变它


如果要从特定偏移量(例如,包含不同格式的顶点)使用VBO,则最后一个参数为
glVertexAttributePointer
。绑定VBO时,最后一个参数是用于顶点属性的数据段的字节偏移量。

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

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

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

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

您可能不理解的是,这些函数定义的顶点格式与缓冲区对象没有永久关联。例如,可以使用具有字节颜色的三维位置,所有这些位置都来自同一缓冲区对象:

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字节。因此,您可以将多个对象的数据放在同一个缓冲区中


现在,OpenGLES1.1没有提供D3D所提供的一件事。调用DrawIndexedPrimitives时,可以提供一个偏移量,该偏移量在从数组中获取顶点之前添加到每个索引中。桌面OpenGL 3.2及以上版本提供了这一点(以及通过扩展提供的更低版本),但ES 1.1没有提供。

您对“相同大小顶点”的理解是什么?我假设这些幻数只是为了说明目的?真正的代码应该使用
sizeof
offsetof
。感谢Nicol Bolas和详细的解释。关于“缓冲区对象的工作方式非常简单”你是对的:P.我已经用glVertexPointer解决了我的问题,不知道为什么我在发布问题时完全忘记了它,我的错。再次感谢您,祝您度过愉快的一天。谢谢kvark,我一看到您的“GLVertexAttributePointer”就知道如何解决我的问题,它非常有启发性(实际上在我的例子中应该是“glVertexPointer”),我已经多次使用该函数,不幸的是,当我茫然地看着“GLDrawerElements”时,我完全忘记了它。非常感谢。