OpenGL ES 2.0:似乎无法渲染第二个 VBO?
Posted
技术标签:
【中文标题】OpenGL ES 2.0:似乎无法渲染第二个 VBO?【英文标题】:OpenGL ES 2.0: Can't seem to render second VBO? 【发布时间】:2014-03-02 01:23:43 【问题描述】:我在 OpenGL ES 2.0 中有 2 个 VBO 和 2 个 IBO。我在渲染第一个 VBO 时没有任何问题,但第二个 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);
【问题讨论】:
glGetError
说什么?
@ViníciusGobboA.deOliveira 没有错误。
【参考方案1】:
结果我的索引是按顺时针顺序声明的(认为这将面向相机的法线)并启用了 GL_CULL_FACE。切换索引,一切都很好。
【讨论】:
以上是关于OpenGL ES 2.0:似乎无法渲染第二个 VBO?的主要内容,如果未能解决你的问题,请参考以下文章