Opengl es 什么是好的OpenGLES1.x实践?

Opengl es 什么是好的OpenGLES1.x实践?,opengl-es,Opengl Es,我刚开始在Android中使用OpenGL ES,但我想这也适用于其他使用OpenGL ES的移动平台。我已经阅读了一些教程来开始学习,但我觉得我缺少了很多东西 例如,让对象单独绘制自己是一种好的做法吗?我有一个立方体对象可以自己绘制,然后我有一个“面板”对象,它是一个10x10个立方体的数组,最后是另一个由面板组成的对象,用来创建一个类似立方体的对象。我有7500个立方体需要绘制,尽管每个立方体都非常“小”。以下是绘图函数的外观: public void draw(GL10 gl) {

我刚开始在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);
绘制时,每个对象都会调用它,它是必要的还是可以在我最上面的对象中调用一次

此外:


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

您可以使用批处理程序将所有顶点批处理到一个数组中,然后进行绘制,从而只使用一个绘制调用

编辑:下面是我的项目的一个例子。我有几个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();
//更新
对于(int i=0;i

在我的绘图方法中,我开始批处理,添加到批处理,最后结束批处理(实际绘制)。在更新方法中,我循环遍历每个NPC对象并更新每个NPC。在NPC对象的更新方法中,我随机生成几个数字,并根据随机数字移动它们(执行所有使它们行为不同的逻辑)。因为每个NPC都有自己的随机生成的数字更新,所以它们的行为都不同。所有的绘图都是一次完成的。图形一次完成并不重要,重要的是每个对象的更新,这是您正在寻找的对象。

您的opengl es性能在很大程度上取决于您的gl调用次数, 因此,尽量减少gl调用。
如果这是你唯一可以画画的地方,无需每次禁用消隐面和顶点数组,只需将消隐面的启用调用置于初始化方法中,这样它将只启用一次。

在遍历每个对象后,是否可以调用gl.glDrawerElements?可以将所有顶点和索引添加到一个数组中?我不完全确定,但因为gldrawerelements需要您为它提供绘制每个三角形的索引,您需要将它们全部分组在一起。对不起,批处理是否允许精确定位顶点?假设我需要旋转一个立方体,或者我需要直接更改所述顶点以对应屏幕上的位置?我不明白为什么需要更改顶点。提交后,可以调用glRotate()或glTranslate。批处理只允许您将所有顶点添加到一起,并通过一个绘制调用绘制所有顶点,而多个调用可能会妨碍您的性能。我的意思是,当前所有顶点都是围绕(0,0,0)创建的,然后每次绘制时都旋转或平移到位。我意识到这可能是个坏习惯。所以我要问的是,我应该在手动将顶点精确放置在我想要的位置之前进行旋转和平移,并避免额外的开销。这是我能看到批量绘图正常工作的唯一方法。根据我的经验,这就是一直以来的做法。假设你在(10,10)处画了一艘宇宙飞船,它需要在x轴上移动10个单位。您不会将顶点从(每个顶点)(10,10)更改为(20,10),而是将其平移10个单位。您可以始终通过glPushMatrix()复制当前默认矩阵,并在推送后进行绘图,以便除推送矩阵调用后的代码外,其他任何代码都不会受到影响。然后就是glPopMatrix()。我熟悉glPushMatrix和glPopMatrix,并在当前绘图中使用它们。让我困惑的是,我该如何将所有顶点组合在一起进行绘制,但仍然能够单独操纵它们的位置?好的,所以一旦激活,就没有必要禁用选项,除非启用直接冲突的选项?
// 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();