为什么这不想画多次?

时间:2012-07-07 10:08:55

标签: java opengl lwjgl

我正在学习opengl,我想绘制50个纹理(来自一个变量)这就是我所做的:   在更新方法中:

public void update(){
    while(!Display.isCloseRequested()){
        input();
        for(int x = 0; x< 100; x++){
            block = new GrassBlock(x*32,10);
            block.draw();
        }
        Display.update();   
        Display.sync(60);
    }
}

这是我初始化openGL的方式:

    private void initGL(){
    glEnable(GL_TEXTURE_2D);
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    glViewport(0, 0,640 , 480);
    glMatrixMode(GL_MODELVIEW);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0,640 , 480, 0, 1, -1);
    glMatrixMode(GL_MODELVIEW);
}

这是GrassBlock绘制方法:

@Override
public void draw() {
    grass.bind();
    glBegin(GL_QUADS);
    glTexCoord2f(0, 0);
    glVertex2f(100, 100);
    glTexCoord2f(1, 0);
    glVertex2f(100+grass.getTextureWidth(),100);
    glTexCoord2f(1,1);
    glVertex2f(100+grass.getTextureWidth(),100+grass.getTextureHeight());
    glTexCoord2f(0,1);
    glVertex2f(100,100+grass.getTextureHeight());
    glEnd();
}

另外,我知道我不能把块创建放在update方法中因为它循环,但是如何解决我可以从一个变量中绘制多个纹理?

现在我只得到一个,它总是闪烁。

1 个答案:

答案 0 :(得分:2)

您可能忘记清除深度缓冲区

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
                            ^^^^^^^^^^^^^^^^^^^^^

initGL中的所有代码实际上都属于重绘函数的开头。应通过从图形系统请求窗口大小来获取视口的尺寸。

glViewport(0, 0,640 , 480);
glMatrixMode(GL_MODELVIEW); <<<<<<<<
glMatrixMode(GL_PROJECTION);
glLoadIdentity();

切换到模型视图矩阵时没有任何操作,因为您在之后立即切换回投影。

最好在绘图函数开始时将所有矩阵重置为标识,以启动一个众所周知的状态。