我正在使用 LWJGL 2.8.5 开发一个 3D 可视化应用程序。在阅读了项目主页上的第一个教程后,我还阅读了一本 OpenGL 书籍,深入分析了我的分析。我看到 OpenGL 中的典型过程是在 init 函数中绘制场景,然后简单地在循环中调用显示的更新。
但是,当我使用 LWJGL 尝试此操作时,我会在显示屏上看到闪烁效果。消除闪烁的唯一方法是在显示更新周期中重新绘制场景。为什么会这样?
为了更好地解释我的问题,我创建了一个简单的类来重现该问题。它只是在屏幕中央绘制一个四边形,然后进入无限的屏幕更新循环。
请注意,如果我取消注释循环内的绘图调用,那么闪烁就会消失,一切正常。为什么?
我期望只绘制一次对象并移动相机以获得静态场景的不同视图,这有什么问题吗?
这是代码:
package test;
import org.lwjgl.LWJGLException;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.DisplayMode;
import org.lwjgl.opengl.GL11;
import org.lwjgl.util.glu.GLU;
import static org.lwjgl.opengl.GL11.*;
public class DisplayTest
{
public static void initGL()
{
GL11.glViewport(0, 0, 640, 480);
glMatrixMode(GL_PROJECTION);
GLU.gluPerspective(45.0f, 640f/480f,0.1f, 100.0f);
draw();
}
public static void draw()
{
glMatrixMode(GL_MODELVIEW);
GL11.glLoadIdentity(); // Reset The Current Modelview Matrix
GL11.glTranslatef(0, 0, -6.0f);//Place at the center at -6 depth units
//Start drawing a quad
//--------------------------------------------------
GL11.glBegin(GL11.GL_QUADS);
int size=1;
GL11.glColor3f(.3f, .5f, .8f);
GL11.glVertex3f(-size/2f,-size/2f,+size/2f);
GL11.glVertex3f(+size/2f,-size/2f,+size/2f);
GL11.glVertex3f(+size/2f,+size/2f,+size/2f);
GL11.glVertex3f(-size/2f,+size/2f,+size/2f);
glEnd();
}
public static void main(String[] args)
{
try
{
// Sets the width of the display to 640 and the height to 480
Display.setDisplayMode(new DisplayMode(640, 480));
// Sets the title of the display
Display.setTitle("Drawing a quad");
// Creates and shows the display
Display.create();
}
catch (LWJGLException e)
{
e.printStackTrace();
Display.destroy();
System.exit(1);
}
initGL();
// While we aren't pressing the red button on the display
while (!Display.isCloseRequested())
{
//draw();
// Update the contents of the display and check for input
Display.update();
// Wait until we reach 60 frames-per-second
Display.sync(60);
}
// Destroy the display and render it invisible
Display.destroy();
System.exit(0);
}
}