我是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中使用的函数,例如openGL. :)
我试图进行本文档中描述的优化:将索引和顶点作为一个包含其所有数据的结构:位置、颜色(清单9-1)
typedef struct _vertexStruct
{
GLfloat position[3];
GLubyte color[4];
} VertexStruct;
const VertexStruct vertices[] = {...};
const GLushort indices[] = {...};
并使用VBO,如清单9-2、9-3所示
正如我所提到的,在openGL es1.1中使用的一些函数并不存在。我想知道在ES 1.1中是否有同样的方法,可能是使用其他代码吗?
谢谢,亚历克斯
编辑根据基督教徒的答案,尝试使用glVertexPointer,glColorPointer。这是代码,它打印立方体,但没有颜色.:有人可以在这样的menner中使用VBO使用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);
}
发布于 2011-09-01 17:56:55
像glVertexAttribPointer
和glEnableVertexAttribArray
这样的函数用于通用的自定义顶点属性(这是OpenGL es2.0中唯一支持的提交顶点数据的方法)。
当使用固定函数管道(在OpenGL es1.1中必须使用)时,只需使用内置属性(考虑到glVertex
和glColor
调用,您可能在切换到顶点数组之前就已经使用了)。每个属性都有类似于其直接模式对应的函数,如glVertexPointer
或glColorPointer
(而不是glVertexAttribPointer
)。通过使用常量(如gl(En/Dis)ableClientState
或GL_COLOR_ARRAY
)调用GL_VERTEX_ARRAY
或GL_COLOR_ARRAY
(而不是gl(En/Dis)ableVertexAttribArray
)来启用/禁用这些数组。
但是,作为一般规则,您不应该使用2.0资源学习OpenGL es1.1编程,因为大部分信息对您没有用处(至少如果您是OpenGL新手的话)。例如,链接站点上描述的一些方法可能在1.1中不受支持,比如VBO,甚至VAOs。但我也不得不承认,我完全没有经验,所以我不能完全肯定这一点。
编辑:关于更新代码的:我假设没有颜色意味着立方体是单一颜色,可能是白色。在您使用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。
顺便说一句,既然您在ES1.1中使用了VBO,并且至少绘制了一些东西,那么es1.1似乎支持VBO。我不知道这个。但我不确定它是否也支持VAOs。
顺便说一句,在这两个函数的末尾使用元素数组缓冲区之后,您应该调用glBindBuffer(GL_ARRAY_BUFFER, 0)
,并同样调用元素数组缓冲区。否则,您可能会遇到其他函数中的问题,这些函数假定没有缓冲区,但缓冲区仍然是绑定的。请始终记住,OpenGL是一个状态机,您设置的每个状态都保持不变,直到它再次更改或上下文被破坏为止。
https://stackoverflow.com/questions/7274219
复制相似问题