当我尝试渲染2D和3D时,我的引擎闪烁

时间:2014-01-08 04:36:51

标签: java opengl 3d buffer lwjgl

我正在与LWJGL合作制作游戏。这是非常基本的。在实现任何类型的gpu渲染或花哨的模型加载器之前,我想确保我至少可以同时渲染2D和3D;当你四处走动时,我的游戏有一个gui。或者至少,它应该是。这是我的初始化代码;当我只渲染3D时,不会发生闪烁。

public void clearGL() {

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
    glLoadIdentity();
}

public void init3D() {

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();

    gluPerspective((float) 68, Engine.size[0] / Engine.size[1], 0.3f, 1000);
    glMatrixMode(GL_MODELVIEW);

    glEnable(GL_TEXTURE_2D);
    glShadeModel(GL_SMOOTH);
    glClearColor(0.0f, 0.0f, 0.0f, 0.5f);
    glClearDepth(1.0f);
    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LEQUAL);


}

public void render3D(Camera c) {

    init3D();
    clearGL();

    //Do translations here
    glTranslatef(0f, -5f, 0f);


    glColor3f(0, 1, 0);
    glBegin(GL_QUADS);
    glVertex3f(-50f, 0f, -50f);
    glColor3f(0, 0, 1);
    glVertex3f(50f, 0f, -50f);
    glColor3f(1, 0, 0);
    glVertex3f(50f, 0f, 50f);
    glColor3f(0, 1, 1);
    glVertex3f(-50f, 0f, 50f);
    glEnd();


}

public void init2D() {

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0, Engine.size[0], 0, Engine.size[1], -1, 1);
    glMatrixMode(GL_MODELVIEW);
    glEnable(GL_TEXTURE_2D);
    glLoadIdentity();


}

public void render2D() {
    init2D();

    glBegin(GL_QUADS);
    glVertex2f(0f, 50f);
    glVertex2f(50f, 50f);
    glVertex2f(50f, 0f);
    glVertex2f(0f, 0f);

    glPopMatrix();

}

我可以告诉它的渲染,因为我正在绘制一个四边形来表示JBullet中的地板。出于某种原因,它位于摄像头的上方,但是当我将摄像机向上移动时它会越来越远,这就是我将摄像机转换为-5的原因。这是另一个问题,另一天。

1 个答案:

答案 0 :(得分:0)

如果您打算在 Z = 0 确实 会考虑禁用深度测试>(深度范围的中间)。如果不这样做,3D场景中可见空间的一半可能会阻碍2D绘图。或者,您可以使用glVertex2f (...)替换glVertex3f (x,y, -1.0)来电,将2D中的所有内容都放到深度范围的最前面。

但关于所有这一切的真正奇怪之处在于render2D (...)函数的结束:你永远不会调用glEnd (...)并弹出一个你似乎永远不会推动的矩阵。这是两个不匹配的怪异来源,其中一个可能导致你的问题。