在标题中我希望能够每帧/更新一次调用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。
答案 0 :(得分:5)
减速不是由于glBegin ... glEnd,而是巨大数量的glNormal,glTexCoord,...... glVertex在中间调用。这称为立即模式,自OpenGL-1.1发布以来一直不合时宜,支持Vertex Arrays。那是在15年前。
请使用Vertex Arrays,最好与Vertex Buffer Objects结合使用;这就是真正的表现改进来自的地方。
答案 1 :(得分:1)
立即模式发送绘制调用以便每帧都渲染,您不需要尝试这样做。我建议你学习顶点缓冲对象,它们将相似的顶点组合在一起,每帧将它们发送到GPU一次,并且可以修改。它们使用floatbuffers进行存储,是渲染对象的新方法。对于LWJGL教程,在youtube上搜索TheCodingUniverse并查找他的高级渲染视频,它将向您展示如何使用VBO。