OpenGL ES 1.1:无法转换为VBO

时间:2012-06-28 13:17:08

标签: iphone opengl-es vbo

我尝试将我的顶点数据转换为VBO,我总是得到一个黑屏......我无法弄清楚我的实现有什么问题。在我的渲染中,如果我删除了bindBuffer调用,并且我将我的顶点指针传递给glVertexPointer而不是0它就可以工作,所以nbVertices和顶点被正确填充。

Vec3定义:

struct vec3
{
    float x;
    float y;
    float z;
}

创作:

glGenBuffers(1, &vertexBuffer);
glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(vec3) * this->nbVertices, vertices, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER,0);

渲染:

glClear(GL_COLOR_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

// draw cube
glScalef(scaleX, scaleY, scaleZ);

glRotatef(rotX, 1, 0, 0);
glRotatef(rotY, 0, 1, 0);
glRotatef(rotZ, 0, 0, 1);

for (int i=0; i<nbTextures; i++)
{
    glBindTexture(GL_TEXTURE_2D, textureIds[i]);

    glBindBuffer(GL_ARRAY_BUFFER,vertexBuffer);
    glEnableClientState(GL_VERTEX_ARRAY);
    glVertexPointer(3, GL_FLOAT, 0, 0/*this->vertices*/);

    glEnableClientState(GL_NORMAL_ARRAY);
    glNormalPointer(GL_FLOAT, 0, this->normals);

    glEnableClientState(GL_TEXTURE_COORD_ARRAY);
    glTexCoordPointer(2, GL_FLOAT, 0, this->texCoords);

    glDrawArrays(GL_TRIANGLE_STRIP, 0, this->nbVertices);
}

glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_NORMAL_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glBindBuffer(GL_ARRAY_BUFFER,0);

1 个答案:

答案 0 :(得分:2)

问题是您正在将VBO与客户端阵列混合使用。虽然这没有问题,但是当绑定VBO时,您不能指定指向客户端数组的指针(就像对顶点数组之外的每个其他数组一样)。指针将被视为缓冲区的偏移量。

因此,在调用glVertexPointer之后取消绑定缓冲区:

glBindBuffer(GL_ARRAY_BUFFER,vertexBuffer);
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, 0/*this->vertices*/);
glBindBuffer(GL_ARRAY_BUFFER,0);

glEnableClientState(GL_NORMAL_ARRAY);
glNormalPointer(GL_FLOAT, 0, this->normals);

glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glTexCoordPointer(2, GL_FLOAT, 0, this->texCoords);

或者,更好的是不要混合VBO和客户端阵列,并为每个属性使用VBO。您可以为每个属性使用相同的VBO,并将各个数组一个接一个地放置,在这种情况下,您必须稍微使用偏移量,或者将每个顶点的属性数据依次放入(通常是最好的方法) ),你也必须使用步幅参数。但是你也可以为每个属性使用不同的VBO,但在这种情况下,请记住在每次调用gl...Pointer之前绑定正确的VBO,如上所述。