繁体   English   中英

Java OpenGL lwjgl先绘制2D,然后绘制3D,然后绘制2D,错误

[英]java OpenGL lwjgl draw 2D then 3d then 2d, error

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

这是当我尝试在3d之后绘制2D图层时发生的事情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. 您正在使用glOrtho (...)设置您的ModelView矩阵
  2. 您在glOrtho (...)反转了Y轴

虽然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 ();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM