2011-09-01 135 views
4

我是openGL的新手。 IAM使用苹果的文档,主修referens 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和ES 2.0中使用顶点缓冲区对象绘图

我的问题是,我使用这些清单中所使用的OpenGL ES 1.1 没有这样的功能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

正如我所提到的,一些是用来在那里的功能不存在在OpenGL ES 1.1。我想知道是否有一种方法可以在ES 1.1中使用其他代码做同样的事情?

感谢, 亚历


编辑根据基督徒回答,试图用glVertexPointer,glColorPointer。 下面是代码,它打印的立方体,但没有颜色... :(任何人,是否有可能使用使用在这样menner 维也纳组织ES 1.1

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 
}; 

功能

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); 
} 

回答

4

功能类似于glVertexAttribPointerglEnableVertexAttribArray用于通用自定义顶点属性(这是在OpenGL ES 2.0中提交顶点数据的唯一支持方法)。当使用固定功能流水线时(就像在OpenGL ES 1.1中一样),只需使用内置属性(考虑调用glVertexglColor,您可能在切换到顶点数组之前使用过)。每个属性都有与其直接模式相对应的功能,如glVertexPointerglColorPointer(而不是glVertexAttribPointer)。这些数组通过调用gl(En/Dis)ableClientState使用常量,如GL_VERTEX_ARRAYGL_COLOR_ARRAY(而不是gl(En/Dis)ableVertexAttribArray)来启用/禁用。

但是作为一般规则,你不应该学习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用0代替,每1.0用255代替。

顺便说一下,由于您在ES 1.1中使用VBOs并且至少绘制了一些东西,因此ES 1.1似乎支持VBO。我不知道。但我不确定它是否也支持VAO。

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

+0

嘿,谢谢你的回复,我试着用你提到的功能。使用它们,openGL绘制立方体,但没有颜色...我通过添加一些代码来编辑相应的问题,也许你可以给我一些代码 – alexpov

+0

的建议@alexpov更新了我的答案。 –

+0

立方体是黑色的,是的重复是一个错字:),修复它。 Color3D没问题,它是一个带有4字节组件的结构,我也添加了它的声明,以及Vertex3D和@alexpov找到它的立方体数据 – alexpov

相关问题