OpenGL ES 1.1:无法转换为 VBO

Posted

技术标签:

【中文标题】OpenGL ES 1.1:无法转换为 VBO【英文标题】:OpenGL ES 1.1: Fail to convert to VBO 【发布时间】:2012-06-28 13:17:07 【问题描述】:

我尝试将我的顶点数据转换为 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】:

问题在于您将 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,如上所示。

【讨论】:

啊!感谢小费,它就像一个魅力!我实际上只将 vbo 用于顶点,所以我可以测试它是否有效,我实际上想转换所有内容......我将尝试使用交错的顶点数据

以上是关于OpenGL ES 1.1:无法转换为 VBO的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL - 从 DisplayList 转换为使用 VBO

OpenGL ES 2.0:似乎无法渲染第二个 VBO?

安卓 OpenGL ES 2.0 VBO

在 OpenGL ES 中,多个程序可以使用相同的 VBO 并绑定到它们的属性吗?

OpenGL ES 2.0 VBO 问题

共享内存架构中的 OpenGL (ES 2.0) VBO 性能