我正在学习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方法中因为它循环,但是如何解决我可以从一个变量中绘制多个纹理?
现在我只得到一个,它总是闪烁。
答案 0 :(得分:2)
您可能忘记清除深度缓冲区
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
^^^^^^^^^^^^^^^^^^^^^
initGL
中的所有代码实际上都属于重绘函数的开头。应通过从图形系统请求窗口大小来获取视口的尺寸。
glViewport(0, 0,640 , 480);
glMatrixMode(GL_MODELVIEW); <<<<<<<<
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
切换到模型视图矩阵时没有任何操作,因为您在之后立即切换回投影。
最好在绘图函数开始时将所有矩阵重置为标识,以启动一个众所周知的状态。