2014-03-02 70 views
1

我在OpenGL ES 2.0中有2個VBO和2個IBO。我沒有任何問題渲染第一個VBO,但第二個沒有渲染。我也沒有得到一個錯誤。OpenGL ES 2.0:似乎無法呈現第二個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); 
+0

'glGetError'說什麼? –

+0

@ViníciusGobboA.deOliveira沒有錯誤。 – ReX357

回答

0

所以原來我不得不按順時針順序並啓用GL_CULL_FACE(這將朝向相機的正常思維)宣佈我的指標。轉換指數,並與世界一切都很好。