首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在OpenGL es1.1vs2.0中使用顶点缓冲区对象绘制

在OpenGL es1.1vs2.0中使用顶点缓冲区对象绘制
EN

Stack Overflow用户
提问于 2011-09-01 17:40:22
回答 1查看 5.5K关注 0票数 4

我是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)

代码语言:javascript
运行
复制
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吗?

代码语言:javascript
运行
复制
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;

立方体数据:

代码语言:javascript
运行
复制
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 
};

函数

代码语言:javascript
运行
复制
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);
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-09-01 17:56:55

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

当使用固定函数管道(在OpenGL es1.1中必须使用)时,只需使用内置属性(考虑到glVertexglColor调用,您可能在切换到顶点数组之前就已经使用了)。每个属性都有类似于其直接模式对应的函数,如glVertexPointerglColorPointer (而不是glVertexAttribPointer)。通过使用常量(如gl(En/Dis)ableClientStateGL_COLOR_ARRAY )调用GL_VERTEX_ARRAYGL_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是一个状态机,您设置的每个状态都保持不变,直到它再次更改或上下文被破坏为止。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7274219

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档