[英]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();
}
您正在這里做一些可疑的事情:
glOrtho (...)
設置您的ModelView矩陣 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.