2014-03-02 79 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(这将朝向相机的正常思维)宣布我的指标。转换指数,并与世界一切都很好。