我在OpenGL ES 2.0中有两个VBO和两个IBO。我没有任何问题,渲染第一个VBO,但第二个没有得到渲染。我也没有错误。
第一个VBO包含一个带有9个顶点的GL_STATIC_DRAW对象。第二个VBO包含4个顶点来创建一个简单的2D平面,这样我就可以在其中呈现用户界面。
这是我在C中代码的相关部分。renderBG()呈现第一个VBO,renderUI()呈现第二个VBO。我这样做对吗?

void renderBG(OGL_STATE_T *state) {

    matIdentity(modelViewMatrix);
    matTranslate(modelViewMatrix, 0, 0, -1.0);

    _currentRotation = _currentRotation + 0.5;
    _currentRotation = fmod(_currentRotation, 360);
    matRotate(modelViewMatrix, 0, 0, 45);
    matRotate(modelViewMatrix, 0, _currentRotation, 0);

    const GLfloat *mvMat = modelViewMatrix;
    const GLfloat *pMat = projectionMatrix;

    glClearColor(0, 0.05, 0, 1.0);
    glClearDepthf(10.0f);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glViewport(0,0,state->screen_width, state->screen_height);

    glBindBuffer(GL_ARRAY_BUFFER, state->nsVB);

    glUniformMatrix4fv(_projectionUniform, 1, 0, pMat);
    glUniformMatrix4fv(_modelViewUniform, 1, 0, mvMat);

    glVertexAttribPointer(_positionSlot, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), 0);
    glVertexAttribPointer(_colorSlot, 4, GL_FLOAT, GL_FALSE, sizeof(Vertex),
            (GLvoid *) (sizeof(float) * 3));

    glEnableVertexAttribArray(_positionSlot);
    glEnableVertexAttribArray(_colorSlot);

    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, state->nsIB);
    glDrawElements(GL_TRIANGLES, sizeof(nsIndices)/sizeof(nsIndices[0]),
            GL_UNSIGNED_BYTE, 0);

}

void renderUI(OGL_STATE_T *state) {

    matIdentity(modelViewMatrix);
    matTranslate(modelViewMatrix, 0, 0, -1.0);

    const GLfloat *mvMat2 = modelViewMatrix;
    const GLfloat *pMat2 = projectionMatrix;

    glViewport(0,0,state->screen_width, state->screen_height);

    glBindBuffer(GL_ARRAY_BUFFER, state->uiVB);

    glUniformMatrix4fv(_projectionUniform, 1, 0, pMat2);
    glUniformMatrix4fv(_modelViewUniform, 1, 0, mvMat2);

    glVertexAttribPointer(_positionSlot, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), 0);
    glVertexAttribPointer(_colorSlot, 4, GL_FLOAT, GL_FALSE, sizeof(Vertex),
            (GLvoid *) (sizeof(float) * 3));

    glEnableVertexAttribArray(_positionSlot);
    glEnableVertexAttribArray(_colorSlot);

    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, state->uiIB);
    glDrawElements(GL_TRIANGLES, uiIndicesArraySize / uiIndicesElementSize,
            GL_UNSIGNED_BYTE, 0);

    GLenum err;

    if ((err = glGetError()) != GL_NO_ERROR)
        printf("There was an error");
}

void render(OGL_STATE_T *state) {

    renderBG(state);
    renderUI(state);

    eglSwapBuffers(state->display, state->surface);
    check();
}

编辑:
以下是一些附加信息。这是顶点和索引数组在第二个VBO中的填充方式:
GLfloat _width = uiWidth;
GLfloat _height = uiHeight;

Vertex uiVertices[] = {
    {{-_width,_height,0}, {1,1,1,1}},       // Top left
    {{_width,_height,0}, {1,1,1,1}},        // Top right
    {{-_width,-_height,0}, {1,1,1,1}},      // Bottom left
    {{_width,-_height,0}, {1,1,1,1}}        // Bottom right
};

GLubyte uiIndices[] = {
    0,1,2,
    2,1,3
};

uiVerticesArraySize = sizeof(uiVertices);
uiVerticesElementSize = sizeof(uiVertices[0]);
uiIndicesArraySize = sizeof(uiIndices);
uiIndicesElementSize = sizeof(uiIndices[0]);

printf("%f %f\n", uiVertices[0].Position[0], uiVertices[0].Position[1]);

glGenBuffers(1, &state->uiVB);
glBindBuffer(GL_ARRAY_BUFFER, state->uiVB);
glBufferData(GL_ARRAY_BUFFER, sizeof(uiVertices), uiVertices, GL_STATIC_DRAW);

glGenBuffers(1, &state->uiIB);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, state->uiIB);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(uiIndices), uiIndices, GL_STATIC_DRAW);

最佳答案

所以我的索引是按顺时针顺序声明的(我认为这会朝向相机的法线),并且启用了GL戋u-CULL戋u-face。把指数调换了一圈,全世界都很好。

关于c - OpenGL ES 2.0:似乎无法渲染第二个VBO?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22122700/

10-11 19:41