我想每帧调用glBegin和glEnd一次

时间:2013-03-01 12:38:08

标签: java opengl lwjgl

在标题中我希望能够每帧/更新一次调用glBegin和glEnd,因为我已经听过并且遇到了如果你每次更新多次调用它会大幅减速。

这是我的渲染功能代码:

GL11.glTranslatef(0, 0, -10);
    int x = 0;

    while (x < World.BLOCKS_WIDTH - 1) {
        int y = 0;
        while (y < World.BLOCKS_HEIGHT - 1) {

            if( x * World.BLOCK_SIZE  <= Display.getHeight() ||  y * World.BLOCK_SIZE <= 
                Display.getWidth() ||  x * World.BLOCK_SIZE >= 0 || 
                y * World.BLOCK_SIZE >= 0 ) {

            blocks.b[data.blocks[x][y]].draw(x + Main.PosX, y + Main.PosY);

            }

            y++;
        }
        x++;

}

任何帮助表示感谢。

这是我的块类:

GL11.glPushMatrix();
    GL11.glTranslatef(Xa * World.BLOCK_SIZE, Ya * World.BLOCK_SIZE, 0);
    //GL11.glRotatef(0, 0, 1, 0);
    //GL11.glRotatef(0, 1, 0, 0);

    Texture.bind();



        GL11.glBegin(GL11.GL_QUADS);
        GL11.glColor3f(1f, 1f, 1f);
        //GL11.glNormal3f(0, 0, 1);
        GL11.glTexCoord2f(0, 0);
        GL11.glVertex2f(0, 0);
        GL11.glTexCoord2f(0, 1);
        GL11.glVertex2f(0, S);
        GL11.glTexCoord2f(1, 1);
        GL11.glVertex2f(S, S);
        GL11.glTexCoord2f(1, 0);
        GL11.glVertex2f(S, 0);
        GL11.glEnd();


        GL11.glPopMatrix();

}

PS。我可以理解一些纯粹的OpenGL。

2 个答案:

答案 0 :(得分:5)

减速不是由于glBegin ... glEnd,而是巨大数量的glNormal,glTexCoord,...... glVertex在中间调用。这称为立即模式,自Ope​​nGL-1.1发布以来一直不合时宜,支持Vertex Arrays。那是在15年前。

请使用Vertex Arrays,最好与Vertex Buffer Objects结合使用;这就是真正的表现改进来自的地方。

答案 1 :(得分:1)

立即模式发送绘制调用以便每帧都渲染,您不需要尝试这样做。我建议你学习顶点缓冲对象,它们将相似的顶点组合在一起,每帧将它们发送到GPU一次,并且可以修改。它们使用floatbuffers进行存储,是渲染对象的新方法。对于LWJGL教程,在youtube上搜索TheCodingUniverse并查找他的高级渲染视频,它将向您展示如何使用VBO。