LWJGL Cube Demo奇怪的渲染

时间:2014-06-04 22:34:04

标签: opengl rendering lwjgl cube

我似乎从这个旋转立方体的小演示中得到了一些奇怪的问题:

    private static int x = 0;

    public static void start(Demo lf) {
        try {
            Display.setDisplayMode(new DisplayMode(640,640));
            Display.setTitle("Cube Demo 3D");
            Display.create();
        } catch (LWJGLException e) {
            e.printStackTrace();
        }

        GL11.glMatrixMode(GL11.GL_PROJECTION);
        GL11.glLoadIdentity();
        GL11.glOrtho(-5, 5, -5, 5, -1, 5);
        GL11.glMatrixMode(GL11.GL_MODELVIEW);
        while (!Display.isCloseRequested()) {
            Display.sync(60);
            CubeRenderer.render(lf);
        }

        Display.destroy();
    }

    public static void render(Demo lf) {
        GL11.glClear(GL11.GL_DEPTH_BUFFER_BIT|GL11.GL_COLOR_BUFFER_BIT);
        GL11.glEnable(GL11.GL_CULL_FACE);
        GL11.glEnable(GL11.GL_DEPTH_TEST);
        GL11.glColor3f(1, 0, 0);

        GL11.glRotatef(x++, 1, 1, 1);

        GL11.glBegin(GL11.GL_QUADS);
        GL11.glColor3f(1.0f,1.0f,1.0f);
        GL11.glVertex3f( 1.0f, 1.0f,-1.0f);
        GL11.glVertex3f(-1.0f, 1.0f,-1.0f);
        GL11.glVertex3f(-1.0f, 1.0f, 1.0f);
        GL11.glVertex3f( 1.0f, 1.0f, 1.0f);
        GL11.glColor3f(1.0f,1.0f,1.0f);
        GL11.glVertex3f( 1.0f,-1.0f, 1.0f);
        GL11.glVertex3f(-1.0f,-1.0f, 1.0f);
        GL11.glVertex3f(-1.0f,-1.0f,-1.0f);
        GL11.glVertex3f( 1.0f,-1.0f,-1.0f);
        GL11.glColor3f(1.0f,1.0f,1.0f);
        GL11.glVertex3f( 1.0f, 1.0f, 1.0f);
        GL11.glVertex3f(-1.0f, 1.0f, 1.0f);
        GL11.glVertex3f(-1.0f,-1.0f, 1.0f);
        GL11.glVertex3f( 1.0f,-1.0f, 1.0f);
        GL11.glColor3f(1.0f,1.0f,1.0f);
        GL11.glVertex3f( 1.0f,-1.0f,-1.0f);
        GL11.glVertex3f(-1.0f,-1.0f,-1.0f);
        GL11.glVertex3f(-1.0f, 1.0f,-1.0f);
        GL11.glVertex3f( 1.0f, 1.0f,-1.0f);
        GL11.glColor3f(1.0f,1.0f,1.0f);
        GL11.glVertex3f(-1.0f, 1.0f, 1.0f);
        GL11.glVertex3f(-1.0f, 1.0f,-1.0f);
        GL11.glVertex3f(-1.0f,-1.0f,-1.0f);
        GL11.glVertex3f(-1.0f,-1.0f, 1.0f);
        GL11.glColor3f(1.0f,1.0f,1.0f);
        GL11.glVertex3f( 1.0f, 1.0f,-1.0f);
        GL11.glVertex3f( 1.0f, 1.0f, 1.0f);
        GL11.glVertex3f( 1.0f,-1.0f, 1.0f);
        GL11.glVertex3f( 1.0f,-1.0f,-1.0f);
        GL11.glEnd();

        GL11.glLoadIdentity();
        Display.update();

    }

    public static void main(String argv[]) {
        Demo lf = new Demo(100);
        lf.step();
        CubeRenderer.start(lf);
    }
}

以下是结果图:

Problems with clipping

当立方体旋转时,看起来立方体的正面偶尔会变得不可见,呈现黑色三角形。

1 个答案:

答案 0 :(得分:1)

您的正投影矩阵正在切断多维数据集的一部分:

GL11.glOrtho(-5, 5, -5, 5, -1, 5);

近平面位于-1。但是,当您旋转单位立方体时,变换曲面上的某些点将比-1更接近。光栅化器将丢弃延伸超过近平面的几何体部分。

由于你打开了脸部剔除,你没有看到穿过立方体的后向三角形。如果您为立方体的每个面分配不同的颜色并关闭面部剔除,效果会更明显。然后,您可以通过正在创建的孔看到立方体的两侧。

尝试将近平面设置为-5,或尝试减小立方体的大小。

另外,我建议您避免使用Display.sync()并在初始化期间使用Display.setVSyncEnabled(true)来控制帧速率。