【问题标题】:Is this an efficient way of rendering tiles with OpenGL?这是使用 OpenGL 渲染图块的有效方法吗?
【发布时间】:2020-05-04 14:42:19
【问题描述】:

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

    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 做到这一点?

【问题讨论】:

  • 您使用的是 opengl 1 api。使用现代的 opengl api 更好。
  • 使用瓷砖的确切原因是什么?也许您一直都不需要图块,只需渲染一个四边形和一个适当的片段着色器即可获得相同的结果。

标签: java opengl lwjgl opengl-compat


【解决方案1】:

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

  • 计算glBegin/glEnd内部的坐标
  • 混合使用 doubleint 会强制在类型之间进行代价高昂的转换
  • 不使用向量
  • 昂贵的原语
  • 使用double

使用glVertex2dv 并将坐标预先计算到某个表中会更快(遗憾的是,您当前的 api 不支持需要更改应用架构的静态表)。顺便说一句,这是对 VBO 使用的一个简单的小飞跃。此外,doubles 通常在旧 GL 中被浪费,因为插值器无论如何都是 32 位的(即使在新硬件上也是如此)。所以为了优化,我会将你的代码转换成这样的东西(对不起,我不是用 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。见

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • DisplayLists 通常会减慢当前硬件的速度……它们是 20 年前的事情,但即便如此,也仅适用于某些 gfx 卡。
    猜你喜欢
    • 1970-01-01
    • 2017-04-26
    • 2012-12-20
    • 2012-07-27
    • 2012-01-06
    • 2015-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多