簡體   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