java OpenGL lwjgl绘制2D然后3d然后2d,错误

时间:2013-12-18 22:42:53

标签: java opengl 3d 2d

我可以绘制2D然后3D就好了,但是当我再次绘制2D时,它会清除第一个2D。 这是带3d的2d(星星) http://postimg.org/image/8lbkbnkgv/

这是当我尝试绘制3D图层时发生的事情 http://postimg.org/image/oiac8dcv3/

    public void RenderLoop()
{

glClear(GL_COLOR_BUFFER_BIT);
     glClear(GL_DEPTH_BUFFER_BIT);

    //Draw2d
    glLoadIdentity();
this.init2D();      
    this.Render2DBefore();                
    //Draw2d        

//Draw3d         
    this.init3D();        
    gluLookAt((float)this.myEyeMain.eye.posX, (float)this.myEyeMain.eye.posY, (float)this.myEyeMain.eye.posZ, (float)this.myEyeMain.look.posX, (float)this.myEyeMain.look.posY, (float)this.myEyeMain.look.posZ, 0f, 1f, 0f);
    GL11.glGetFloat(GL11.GL_MODELVIEW_MATRIX, this.modelview);
    Render();
    //Draw3d


    //Draw2d
    glLoadIdentity();
this.init2DB();      
    this.Render2DAfter();                        
    //Draw2d      


    Display.update();
}
public void init2D()
{
    glDisable(GL11.GL_DEPTH_TEST);


    GL11.glEnable(GL11.GL_TEXTURE_2D);              
    GL11.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);         
    // enable alpha blending
        GL11.glEnable(GL11.GL_BLEND);
        GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
        GL11.glViewport(0,0,width,height);

    GL11.glMatrixMode(GL11.GL_MODELVIEW);
    GL11.glOrtho(0, width, height, 0, -1, 1);
    GL11.glMatrixMode(GL11.GL_PROJECTION);
    GL11.glLoadIdentity();



}
public void init2DB()
{
    glDisable(GL11.GL_DEPTH_TEST);


    GL11.glEnable(GL11.GL_TEXTURE_2D);              
    GL11.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);         
    // enable alpha blending
        GL11.glEnable(GL11.GL_BLEND);
        GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
        GL11.glViewport(0,0,width,height);



    GL11.glMatrixMode(GL11.GL_MODELVIEW);
    GL11.glOrtho(0, width, height, 0, -1, 1);
    GL11.glMatrixMode(GL11.GL_PROJECTION);


    GL11.glLoadIdentity();



}
public void init3D()
{
    glDisable(GL11.GL_TEXTURE_2D);

    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LESS);
    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
    glMatrixMode(GL_PROJECTION);
    gluPerspective(45f, (float) width / (float) height, 1f, this.viewMax);        
    GL11.glGetFloat( GL11.GL_PROJECTION_MATRIX, this.projection);
    GL11.glGetInteger(GL11.GL_VIEWPORT, this.viewport);

    glMatrixMode(GL_MODELVIEW);                
    glLoadIdentity();

}

1 个答案:

答案 0 :(得分:1)

你在这里做了几件可疑的事情:

  1. 您正在使用glOrtho (...)设置ModelView矩阵
  2. 您的Y轴在glOrtho (...)
  3. 中倒置

    虽然1肯定是需要纠正的错误,但2完全有效,但我想提一些关于反转投影矩阵的Y轴的事情。

    当您将点(0,0)设置为窗口的左上角时,如果依赖于OpenGL的任何部分,该部分取决于正在绘制多边形的哪一侧(前/后)(例如,面部剔除,顶点照明,模板),它们将无法按预期工作。此投影矩阵会改变投影的惯性,您需要从默认值重新定义正面:逆时针顺时针。通常在2D中这并不重要,但如果您在3D设置中启用了背面剔除并忘记将其关闭,则可能会成为一个非常严重的问题。

    要更正init2D (...)init2DB (...)函数,请重新编写矩阵设置代码:

    GL11.glMatrixMode   (GL11.GL_PROJECTION);
    GL11.glLoadIdentity ();
    GL11.glOrtho        (0, width, height, 0, -1, 1);
    
    GL11.glMatrixMode   (GL11.GL_MODELVIEW);
    GL11.glLoadIdentity ();