使用OpenGL ES 1.1中的顶点缓冲对象和ES 2.0进行绘制

我是openGL的新手。 我使用苹果文档作为我的主要参考资料http://developer.apple.com/library/ios/#documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/TechniquesforWorkingwithVertexData/TechniquesforWorkingwithVertexData.html#//apple_ref/doc/uid/TP40008793-CH107-SW6

我的问题是我使用的是openGL ES 1.1而不是2,因此清单9-3中使用的函数如glVertexAttribPointerglEnableVertexAttribArray都无法识别…… 🙂

我试图进行本文档中描述的优化:将索引和顶点保存为包含其所有数据的结构:位置,颜色(清单9-1)

typedef struct _vertexStruct { GLfloat position[3]; GLubyte color[4]; } VertexStruct; const VertexStruct vertices[] = {...}; const GLushort indices[] = {...}; 

并使用清单9-2,9-3中的VBO

正如我所提到的,openGL ES 1.1中不存在一些在那里使用的函数。 我想知道是否有一种方法可以在ES 1.1中使用其他代码吗?

谢谢,亚历克斯


根据基督徒的回答编辑,尝试使用glVertexPointer,glColorPointer。 这是代码,它打印多维数据集,但没有颜色…… :(。任何人,是否可以使用ES 1.1这样的方式使用VBO

 typedef struct { GLubyte red; GLubyte green; GLubyte blue; GLubyte alpha; } Color3D; typedef struct { GLfloat x; GLfloat y; GLfloat z; } Vertex3D; typedef struct{ Vector3D position; Color3D color; } MeshVertex; 

立方体数据:

 static const MeshVertex meshVertices [] = { { { 0.0, 1.0, 0.0 } , { 1.0, 0.0, 0.0 ,1.0 } }, { { 0.0, 1.0, 1.0 } , { 0.0, 1.0, 0.0 ,1.0 } }, { { 0.0, 0.0, 0.0 } , { 0.0, 0.0, 1.0 ,1.0 } }, { { 0.0, 0.0, 1.0 } , { 1.0, 0.0, 0.0, 1.0 } }, { { 1.0, 0.0, 0.0 } , { 0.0, 1.0, 0.0, 1.0 } }, { { 1.0, 0.0, 1.0 } , { 0.0, 0.0, 1.0, 1.0 } }, { { 1.0, 1.0, 0.0 } , { 1.0, 0.0, 0.0, 1.0 } }, { { 1.0, 1.0, 1.0 } , { 0.0, 1.0, 0.0, 1.0 } } }; static const GLushort meshIndices [] = { 0, 1, 2 , 2, 1, 3 , 2, 3, 4 , 3, 5, 4 , 0, 2, 6 , 6, 2, 4 , 1, 7, 3 , 7, 5, 3 , 0, 6, 1 , 1, 6, 7 , 6, 4, 7 , 4, 5, 7 }; 

function

 GLuint vertexBuffer; GLuint indexBuffer; - (void) CreateVertexBuffers { glGenBuffers(1, &vertexBuffer); glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer); glBufferData(GL_ARRAY_BUFFER, sizeof(meshVertices), meshVertices, GL_STATIC_DRAW); glGenBuffers(1, &indexBuffer); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer); glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(meshIndices), meshIndices, GL_STATIC_DRAW); } - (void) DrawModelUsingVertexBuffers { glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer); glVertexPointer(3, GL_FLOAT, sizeof(MeshVertex), (void*)offsetof(MeshVertex,position)); glEnableClientState(GL_VERTEX_ARRAY); glColorPointer(4, GL_UNSIGNED_BYTE, sizeof(MeshVertex), (void*)offsetof(MeshVertex,color)); glEnableClientState(GL_COLOR_ARRAY); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer); glDrawElements(GL_TRIANGLE_STRIP, sizeof(meshIndices)/sizeof(GLushort), GL_UNSIGNED_SHORT, (void*)0); glDisableClientState(GL_VERTEX_ARRAY); glDisableClientState(GL_COLOR_ARRAY); } 

glVertexAttribPointerglEnableVertexAttribArray这样的函数用于通用自定义顶点属性(这是在OpenGL ES 2.0中提交顶点数据的唯一受支持的方法)。

使用固定function管道时(就像在OpenGL ES 1.1中一样),您只需使用内置属性(想想glVertexglColor调用,您可能在切换到顶点数组之前使用过)。 每个属性都有一些函数,它们被称为类似于它们的立即模式对应物,如glVertexPointerglColorPointer (而不是glVertexAttribPointer )。 通过使用GL_VERTEX_ARRAYGL_COLOR_ARRAY (而不是gl(En/Dis)ableVertexAttribArray )等常量调用gl(En/Dis)ableClientState来启用/禁用这些数组。

但作为一般规则,您不应该学习使用2.0资源的OpenGL ES 1.1编程,因为大部分信息对您没有用处(至少如果您不熟悉OpenGL)。 例如,您的链接网站上描述的某些方法可能在1.1中不受支持,如VBO甚至VAO。 但我也不得不承认,我完全没有ES经验,所以我不能完全确定。

编辑:关于你更新的代码:我认为没有颜色意味着立方体是单一颜色,可能是白色。 在您的第一个代码示例中,您使用了GLubyte color[4] ,现在它使用了一些Color3D类型,这可能不适合glColorPointer(4, GL_UNSIGNED_BYTE, ...)调用(其中第一个参数是组件数量和第二种类型)?

如果您的Color3D类型只包含3种颜色或浮点颜色,我建议您使用4-ubyte颜色,因为与3个浮点数一起,您应该得到一个完美的16字节对齐顶点,这也是优化他们建议您提供链接。

顺便说一句,在CreateVertexBuffers函数中重复创建索引缓冲区是一个错字,不是吗?

编辑:您的颜色包含ubytes(范围从0(黑色)到255(全彩色))并用浮点数初始化它们。 所以你的浮点值1.0(这肯定意味着全彩色)被转换为ubyte而你得到1,与整个[0,255]范围相比仍然非常小,所以一切都是黑色的。 当你使用ubytes时,你也应该用ubytes初始化它们,所以在颜色数据中只需将0替换为0,每1.0替换255。

顺便说一下,既然你在ES 1.1中使用了VBO并且至少绘制了一些东西,那么ES 1.1似乎支持VBO。 我不知道。 但我不确定它是否也支持VAO。

顺便说一句,你应该在完成在这两个函数的末尾使用它们之后调用glBindBuffer(GL_ARRAY_BUFFER, 0)以及元素数组缓冲区。 但是,你可能会在其他函数中遇到问题,这些函数假定没有缓冲区,但缓冲区仍然是绑定的。 永远记住,OpenGL是一个状态机,你设置的每个状态都会保持不变,直到它再次被改变或者上下文被破坏。