相同的openGL调用在LWJGL中产生不同的结果

时间:2016-10-15 17:34:13

标签: java opengl rendering lwjgl

我们应该使用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();
        }
    }
}

1 个答案:

答案 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根本不支持这些功能。