我可以从glDrawArrays切换到使用顶点缓冲对象吗?

时间:2014-07-31 23:07:08

标签: c++ ios opengl-es vbo

我有一个OpenGL 1.1 ES 2D精灵引擎,它基于每个精灵一个GL_TRIANGLE_FAN。每帧精灵调用的主渲染代码如下:

void drawTexture(BitmapImage* aImage, short* vertices, float* texCoords,
            ColorMap &colorMap, TInt xDest, TInt yDest, TInt aAlpha)
{
    glPushMatrix();
    glLoadIdentity();

    glBindTexture(GL_TEXTURE_2D, textureId);
    glVertexPointer(3, GL_SHORT, 0, vertices);
    glTexCoordPointer(2, GL_FLOAT, 0, texCoords);
    glColorPointer(RGBA_BYTES, GL_UNSIGNED_BYTE, 0, colorMap.GetMap());

    TFloat scaleX, scaleY;
    aImage->getScale(scaleX, scaleY);
    glTranslatef((float)xDest, (float)yDest, 0.0f);
    glScalef(scaleX, scaleY, 1.0f);
    glRotatef(aImage->getRotAngle(), 0.0f, 0.0f, 1.0f);

    glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
    glPopMatrix();
}

我被告知切换到顶点缓冲对象(VBO)会显着提高渲染性能,所以我想这样做。到目前为止,我的研究已经向我介绍了几个示例,说明了如何设置单个顶点,颜色和纹理偏移缓冲区,但是如何交错这些数据的好例子更难以实现。

例如,我很确定这是我在VBO中使用顶点数据进行渲染的方式:

glGenBuffers(1, &batchBufferHandle);
glBindBuffer(GL_ARRAY_BUFFER, batchBufferHandle);
glBufferData(GL_ARRAY_BUFFER, dataSize, data, GL_STATIC_DRAW);
glVertextPointer(3, GL_SHORT, 0, 0);
glDrawElements(..., 0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glDeleteBuffers(1, &batchBufferHandle);

显然我会为纹理坐标和顶点颜色数据生成并绑定类似的缓冲区,但我并不是100%清楚如何设置它们会有所不同。

我的理解是,速度提升将来自于在一个“绘制调用”中渲染一堆这些三角形粉丝,但在这种情况下什么是“绘制调用”?使用这种方法多次调用DrawElements(),因此不能......?

无论如何,这意味着我必须生成一个VBO(或三个),其中包含一系列sprite的所有串行数据。鉴于我正在处理的遗留代码,这本身就足够困难,但我还需要翻译,缩放和旋转每个单独的精灵。这些数据在VBO中的位置是什么?

到目前为止,我的结论是使用VBO仅对单个但复杂的对象有帮助。看起来我想做的事情是不可能的 - 为OpenGL提供一个要渲染的精灵列表(包括每个精灵的所有顶点,颜色,纹理贴图,比例,旋转和翻译信息)。

我的评估是否正确或是否有办法(使用OpenGL ES 1.1)?

0 个答案:

没有答案
相关问题