我有这样的代码:https://github.com/magicgoose/lwjgl-nifty-test-project当我只渲染图形用户界面时,它就像预期的那样工作。当我尝试渲染三角形(在透视投影中),然后渲染GUI时,一切都失败了,甚至GUI也不能正确渲染--我只得到黑色背景上的字母。(如果我在display(...)方法中取消对draw_something()语句的注释,就会发生这种情况)
private def draw_something() {
glTranslatef(0, 0, -20)
glBegin(GL_TRIANGLES)
glVertex3f(0.0f, 1.0f, 0.0f)
glVertex3f(-1.0f, -1.0f, 0.0f)
glVertex3f(1.0f, -1.0f, 0.0f)
glEnd()
}我做错了什么?我试着搜索以漂亮的gui和3d图形为背景的工作示例,但没有成功。
更新1
我已经根据datenwolf的回答更改了代码,现在GUI渲染正常,但我只能看到几毫秒的白色三角形(也许实际上它在一个帧中?),看起来3d设置正在“损坏”……只有当我渲染图形用户界面时才会发生这种情况,如果我注释了行gui.render(false),则白色三角形会留在屏幕上。
更新2
我添加了一些动作到3d部分(参见仓库中的更新),现在我可以看到三角形几乎看不见了(它看起来像z-fighting)。
发布于 2012-11-29 08:25:33
必须在正交投影和透视投影之间切换。为此,准备了两个函数:display_ready2d (设置正交投影矩阵)和display_ready3d (设置透视投影)。
不幸的是,display_ready3d函数在应用其更改之前不会重置矩阵堆栈。在调用gluPerspective之前,必须添加一个glLoadIdentity。此外,您不应该清除这些函数中的帧缓冲区,因为您希望能够在矩阵设置之间切换。因此,将其更改为:
private def display_ready3d(fov: Float, aspect: Float) {
glMatrixMode(GL_PROJECTION)
glLoadIdentity();
gluPerspective(fov, aspect, 0.01f, 100.0f)
glMatrixMode(GL_MODELVIEW)
glLoadIdentity()
glEnable(GL_DEPTH_TEST)
}在绘制图形用户界面之前使用display_ready2d,在绘制draw_something之前使用display_ready3d。此外,您还必须将clear命令放在那里,该命令还需要覆盖深度缓冲区;此外,clear颜色的alpha值应该为1(除非您已经创建了一个透明窗口)。
def display(width: Int, height: Int, AR: Float, gui: Nifty) {
glViewport(0, 0, width, height)
glClearDepth(1.)
glClearColor(0., 0., 0., 1.)
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
display_ready3d(90, width/height)
draw_something()
display_ready2d(width, height)
gui.render(false)
glFlush()
Display.update()
}发布于 2012-11-29 16:59:29
我在我的一个项目中使用了以下代码来实现这一点。与datenwolf解决方案的主要区别在于,您不必在每次从GUI模式切换回来时都设置3D透视图。在我的例子中,我有一个相当复杂的3D透视设置,因此,依靠这种推/弹矩阵方法更方便。
如果在3D模式中启用了闪电,您可能还需要考虑关闭GUI模式的闪电,以确保GUI颜色不受灯光的影响。
def enableOrthoView(winW: Int, winH: Int) {
glMatrixMode(GL_PROJECTION) // Select projection
glPushMatrix() // Push the matrix
glLoadIdentity() // Reset the matrix
glOrtho(0, winW, winH, 0, -1, 1) // Select ortho mode
glMatrixMode(GL_MODELVIEW) // Select Modelview matrix
glPushMatrix() // Push the Matrix
glLoadIdentity() // Reset the Matrix
glDisable(GL_DEPTH_TEST) // Cure z-fighting
glDisable(GL_LIGHTING) // Ensure unaffected colors
}
def disableOrthoView() {
glMatrixMode(GL_PROJECTION) // Select projection
glPopMatrix() // Pop the matrix
glMatrixMode(GL_MODELVIEW) // Select Modelview
glPopMatrix() // Pop the matrix
glEnable(GL_DEPTH_TEST)
glEnable(GL_LIGHTING)
}发布于 2012-11-30 06:31:24
我已经找到了3d图形闪烁/消失问题的根源。在OpenGL中,如果你在没有提供纹理的情况下绘制几何图形,你必须禁用纹理,所以我写道
glDisable(GL_TEXTURE_2D)
在display_ready3d(...)的末尾,现在一切都在做它必须做的事情。在阅读另一个相关问题的答案时,我意外地意识到了这个失败:https://gamedev.stackexchange.com/questions/44437/lwjgl-mixing-2d-and-3d还要感谢datenwolf和bluenote10,您的帮助是无价的。
https://stackoverflow.com/questions/13615931
复制相似问题