我们应该使用LWJGL 2.9.3来创建一个显示线框对象的简单应用程序。我根据http://www.glprogramming.com/red/chapter01.html的第一个示例代码创建了一个测试类。我最终得到的是一个程序,它会在短暂的瞬间闪烁一个白色方块,然后消失。我不确定我做错了什么。
这是测试代码:
package Test.LWJGL;
import org.lwjgl.input.Keyboard;
import org.lwjgl.input.Mouse;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.DisplayMode;
import static CS355.LWJGL.LWJGLSandbox.DISPLAY_HEIGHT;
import static CS355.LWJGL.LWJGLSandbox.DISPLAY_WIDTH;
import static org.lwjgl.opengl.GL11.*;
import static org.lwjgl.opengl.GL11.glFlush;
public class LWJGLTest {
public static void render() {
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0f, 1.0f, 1.0f);
glOrtho(0, 1.0, 0.0, 1.0, -1.0, 1.0);
glBegin(GL_POLYGON);
glVertex3f(0.25f, 0.25f, 0.0f);
glVertex3f(0.75f, 0.25f, 0.0f);
glVertex3f(0.75f, 0.75f, 0.0f);
glVertex3f(0.25f, 0.75f, 0.0f);
glEnd();
glFlush();
}
public static void main(String[] args) {
try {
Display.setDisplayMode(new DisplayMode(DISPLAY_WIDTH,DISPLAY_HEIGHT));
Display.setFullscreen(false);
Display.create();
glClearColor(0.0f,0.0f,0.0f,0.0f);
while(!Display.isCloseRequested() && !Keyboard.isKeyDown(Keyboard.KEY_ESCAPE)) {
if(Display.isVisible()) {
render();
}
else {
if(Display.isDirty()) {
render();
}
try {
Thread.sleep(100);
}
catch(InterruptedException ex) {}
}
Display.update();
Display.sync(60);
}
}
catch(Exception ex) {
ex.printStackTrace();
}
finally {
Mouse.destroy();
Keyboard.destroy();
Display.destroy();
}
}
}
答案 0 :(得分:1)
OpenGL是一个状态机。这意味着,您可以设置许多状态,这些状态将以某种明确定义的方式影响最终的渲染结果。这些状态从不自动重置,它们只是在您设置时保持不变,直到您更改它们。没有"框架"或"场景对象",只是一个状态设置或绘图命令流。
OpenGL的矩阵堆栈也只是一种状态。函数glOrtho
将将当前所选矩阵堆栈的当前顶部元素与该正交矩阵相乘,并将该顶部元素替换为该结果。
假设Ortho矩阵被称为O
。最初,GL的所有矩阵都是明确的。因此,当您第一次致电render
时,您将获得:M = M * O = I * O = O
。但是,第二次,您将获得M = M * O = O * O
。等等。
您必须在帧的开头明确地将矩阵重置为身份:
glLoadIdentity();
glOrtho(...);
您应该知道您使用的代码不是很好。它使用MODELVIEW
堆栈作为投影矩阵,这意味着转到GL_PROJECTION
。但在你试图了解这些工作人员之前,请注意,所有这些都是在GL十年后完全弃用的。现代核心版本的OpenGL根本不支持这些功能。