什么是好的OpenGL ES 1.x实践?

时间:2011-08-04 00:35:53

标签: opengl-es

我刚开始在Android中使用OpenGL ES,但我想这也适用于使用OpenGL ES的其他移动平台。我已经完成了一些教程,让我开始,但我觉得我有很多不足之处。

例如,让对象单独绘制它们是一种好习惯吗?我有一个绘制自己的立方体对象,然后我有一个“面板”对象,它是一个10x10立方体的数组,最后是另一个由面板组成的对象,用于创建像对象一样的立方体。我需要绘制7500个立方体,尽管每个立方体都非常“小”。这是绘图函数的样子:

public void draw(GL10 gl) {
    gl.glFrontFace(GL10.GL_CCW);

    gl.glEnable(GL10.GL_CULL_FACE);
    gl.glCullFace(GL10.GL_BACK);

    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, verticesBuffer);

    gl.glColor4f(rgba[0], rgba[1], rgba[2], rgba[3]);

    gl.glTranslatef(x, y, z);
    gl.glRotatef(rx, 1, 0, 0);
    gl.glRotatef(ry, 0, 1, 0);
    gl.glRotatef(rz, 0, 0, 1);

    gl.glDrawElements(GL10.GL_TRIANGLES, numOfIndices,
                    GL10.GL_UNSIGNED_SHORT, indicesBuffer);

    gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
    gl.glDisable(GL10.GL_CULL_FACE);
}

在处理OpenGL ES时,还有其他一些应该避免的事情吗?

编辑:我一直在想的另一件事是,减少对某些方法的调用量是一种好习惯,例如

gl.glFrontFace(GL10.GL_CCW);
gl.glEnable(GL10.GL_CULL_FACE);
gl.glCullFace(GL10.GL_BACK);

gl.glDisable(GL10.GL_CULL_FACE);

这是在绘制时为每个对象调用的,是必需的还是可以在我最上面的对象中调用一次?

此外:

gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);

gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);

我意识到根据情况可能需要启用和禁用,但如果可以避免,这是否会对任何事情产生不利影响?

2 个答案:

答案 0 :(得分:1)

您可以使用批处理器将所有顶点批处理为一个数组,然后绘制,因此只使用一个绘制调用。

编辑:这是我项目的一个例子。我有几个NPC需要单独绘制和更新,以便它们彼此独立移动。

// update
    for (int i = 0; i < npcs.length; i++) {
        npcs[i].update(touchEvents);
    }

    // draw
    npcBatcher.beginBatch(Assets.atlas);
    for (int i = 0; i < npcs.length; i++) {
        npcs[i].draw(npcBatcher);
    }
    npcBatcher.endBatch();

在我的绘制方法中,我开始批处理,添加到批处理,最后结束批处理(实际绘制)。在更新方法中,我遍历每个NPC对象并更新EACH NPC。在NPC对象的更新方法中,我随机生成一些数字并根据随机数移动它们(做所有使它们表现不同的逻辑)。由于每个NPC都有自己的随机生成数字更新,因此它们的行为都不同。所有的绘图都是立刻完成的。所有的绘图都无关紧要,重要的是每个对象的更新,并且是您正在寻找的。

答案 1 :(得分:1)

你的操作性能在很大程度上取决于你的gl调用次数, 所以尽量减少gl调用。 如果它是你唯一的绘图位置,则不需要每次都禁用cullface和vertex数组,只在初始化方法中启用cull face的启用调用,以便它只启用一次。