我有这段代码:https://github.com/magicgoose/lwjgl-nifty-test-project
当我只渲染GUI时,它会像预期的那样工作。当我尝试渲染三角形(在透视投影中)然后渲染GUI时,一切都失败了,甚至GUI也无法正确渲染 - 我只得到黑色背景上的字母。 (如果我取消注释,就会发生这种情况
draw_something()
方法中的display(...)
语句
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图形的工作示例,但没有运气。
我已根据datenwolf的答案更改了代码,现在GUI呈现正常,但我只能看到白色三角形几毫秒(实际上它可能在单帧中?),似乎正在进行3D设置“损坏”......只有当我渲染GUI时才会发生这种情况,如果我对行gui.render(false)
发表评论,则白色三角形停留在屏幕上。
我在3d部分添加了一些动作(请参阅存储库中的更新),现在我可以看到三角形几乎看不见(看起来像是z-fighting)。
答案 0 :(得分:4)
您必须在正投影和透视投影之间切换。为此,准备了两个函数: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)
}
在绘制GUI之前display_ready2d,在draw_something之前绘制display_ready3d。你还必须在那里放置清除命令,这也需要覆盖深度缓冲区;另外,清晰的颜色应该具有1的alpha值(除非您创建了透明窗口)。
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()
}
答案 1 :(得分:1)
我在我的一个项目中使用以下代码来实现此目的。 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)
}
答案 2 :(得分:0)
我找到了闪烁/消失3D图形的问题根源。在OpenGL中,如果在不提供纹理的情况下绘制几何体,则必须禁用纹理,因此我写了
glDisable(GL_TEXTURE_2D)
在display_ready3d(...)
的末尾,现在一切都做了它必须做的事情。我在阅读其他相关问题的答案时意外地意识到了这个失败:https://gamedev.stackexchange.com/questions/44437/lwjgl-mixing-2d-and-3d
还要感谢datenwolf
和bluenote10
,您的帮助非常宝贵。