我可以绘制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();
}
答案 0 :(得分:1)
你在这里做了几件可疑的事情:
glOrtho (...)
设置ModelView矩阵glOrtho (...)
虽然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 ();