【问题标题】:why can't I get glDrawElements to draw with VBOs in OpenGLES 2.0?为什么我不能让 glDrawElements 在 OpenGLES 2.0 中使用 VBO 进行绘制?
【发布时间】:2012-09-26 23:04:02
【问题描述】:

我正在尝试在 iOS 中使用 OpenGL 进行简单测试(ES 2.0,但如果它是具有核心配置文件的常规 GL 3.5 或基本上任何没有固定管道的实现,则应该相同):

我已正确设置所有内容(上下文、着色器、mvl 矩阵等)并通过 glDrawArrays 成功渲染了一个三角形,VBO 如下所示:

- (void)loadActors
{           
            GLfloat triangle1[] = {
                -1.0, -2.0, 0.0,
                3.0, 0.0, 0.0,
                0.0, 1.5, 0.0
            };

            GLuint VBO;
            glGenBuffers(1, &VBO);

            glBindBuffer(GL_ARRAY_BUFFER, VBO);
            glBufferData(GL_ARRAY_BUFFER, sizeof(triangle1), triangle1, GL_STATIC_DRAW);
            glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(GLfloat)*3, 0);
            glEnableVertexAttribArray(0);
}

- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect
{
    glClearColor(1., 0., 0., 1.);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glUseProgram(_program);

    glUniformMatrix4fv(uniforms[UNIFORM_MODELVIEWPROJECTION_MATRIX], 1, 0, _modelViewProjectionMatrix.m);
    glUniformMatrix3fv(uniforms[UNIFORM_NORMAL_MATRIX], 1, 0, _normalMatrix.m);

    glDrawArrays(GL_TRIANGLES, 0, 3);
}

现在,我正在尝试启用索引。所以我创建了另一个(全局)数组,它只包含 0,1,2 并尝试使用它来索引 VBO。像这样:

- (void)loadActors
{ 
            GLfloat triangle1[] = {
                -1.0, -2.0, 0.0,
                3.0, 0.0, 0.0,
                0.0, 1.5, 0.0
            };

            indicesG = malloc(sizeof(GLuint)*3);
            indicesG[0] = 0;
            indicesG[1] = 1;
            indicesG[2] = 2;

            GLuint VBO[2];
            glGenBuffers(2, VBO);

            glBindBuffer(GL_ARRAY_BUFFER, VBO[0]);
            glBufferData(GL_ARRAY_BUFFER, sizeof(triangle1), triangle1, GL_STATIC_DRAW);
            glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(GLfloat)*3, 0);
            glEnableVertexAttribArray(0);

            glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, VBO[1]);
            glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indicesG), indicesG, GL_STATIC_DRAW);
}


- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect
{
    glClearColor(1., 0., 0., 1.);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);


    glUseProgram(_program);

    glUniformMatrix4fv(uniforms[UNIFORM_MODELVIEWPROJECTION_MATRIX], 1, 0, _modelViewProjectionMatrix.m);
    glUniformMatrix3fv(uniforms[UNIFORM_NORMAL_MATRIX], 1, 0, _normalMatrix.m);

    glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, 0);
}

我希望索引数组只调用 VBO 的顶点 0,1 和 2,如果我不使用 GL_ELEMENT_ARRAY_BUFFER,就会得到相同的三角形。但相反,似乎没有绘制任何内容。

我错过了什么?

【问题讨论】:

    标签: ios opengl-es-2.0 opengl-3


    【解决方案1】:

    问题实际上是我对 indicesG 数组大小的计算。我在做sizeof(indicesG),应该做sizeof(GLuint)*3

    它适用于glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLuint)*3, indicesG, GL_STATIC_DRAW);

    【讨论】:

      【解决方案2】:

      你有3作为glDrawElements的最后一个参数,应该是0,因为你想从索引VBO的开头开始计数,而不是3个字节。

      【讨论】:

      • 我不这么认为......你说得对,那里的 3 是错误的,但是当我复制问题的代码时这是一个错字。使用 glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, 0);除了透明色中的红色背景色之外,我仍然没有得到任何绘图。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多