这是使用 OpenGL 渲染图块的有效方法吗?

Is this an efficient way of rendering tiles with OpenGL?

这是我用来渲染图块的例程

    private static void renderTile(int x1, int y1, int size) {
        glBegin(GL_TRIANGLES);

        double halfSize = size/2;

        glVertex2d(x1 + halfSize, y1 + halfSize);
        glVertex2d(x1 + halfSize, y1 - halfSize);
        glVertex2d(x1 - halfSize, y1 - halfSize);

        glVertex2d(x1 - halfSize, y1 - halfSize);
        glVertex2d(x1 - halfSize, y1 + halfSize);
        glVertex2d(x1 + halfSize, y1 + halfSize);
        glEnd();
    }

现在,例程有效,但是,它看起来有点乱。 Java OpenGL + LWJGL 有更好的方法吗?

不,效率不高。您应该使用显示列表,甚至更好 - 顶点缓冲对象 (VBO)。

您在旧 GL 中的代码存在重大问题:

  • 计算里面的坐标glBegin/glEnd
  • 混合 doubleint 强制类型之间进行昂贵的转换
  • 不使用向量
  • 昂贵的原始
  • 使用double

更快的方法是使用 glVertex2dv 并将坐标预先计算到一些 table 中(遗憾的是,您当前的 api 不支持需要更改的静态 table在您的应用架构中)。顺便说一句,从那以后,它是进入 VBO 使用的一个简单的小飞跃。 doubles 通常在旧的 GL 中被浪费,因为插值器无论如何都是 32 位的(即使在新的 HW 上)。所以为了优化我会把你的代码转换成这样的东西(对不起,我用 C++ 编写的不是 JAVA 编码器,所以它可能在语法上不正确):

private static void renderTile(float x, float y, float size) 
    {
    const float  a = 0.5*size;
    const float p[4*2]= 
        {
        x-a,y-a,
        x+a,y-a,
        x+a,y+a,
        x-a,y+a,
        };

    glBegin(GL_QUADS);
    glVertex2fv(p); p+=2;
    glVertex2fv(p); p+=2;
    glVertex2fv(p); p+=2;
    glVertex2fv(p); p+=2;
    glEnd();
    }

但是,如果您想要真正的强大功能,请使用 VBO。参见