1

我正在学习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();
}

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

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

4

1 回答 1

2

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

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

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

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

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

在绘图函数开始时将所有矩阵重置为标识,以开始一个众所周知的状态是一种很好的做法。

于 2012-07-07T10:26:17.007 回答