4

我有这个代码: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 图形的工作示例,但没有运气。

更新 1

我已经根据 datenwolf 的回答更改了代码,现在 GUI 渲染正常,但我只能在几毫秒内看到白色三角形(实际上它可能在一个帧中?),似乎 3d 设置正在“损坏” ...仅当我渲染 GUI 时才会发生这种情况,如果我注释 line gui.render(false),白色三角形会留在屏幕上。

更新 2

我在 3d 部分添加了一些动作(请参阅存储库中的更新),现在我可以看到三角形几乎不可见(看起来像 z 战斗)。

4

3 回答 3

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。此外,您必须将清除命令放在那里,这也需要覆盖深度缓冲区;透明色的 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-29T00:25:33.410 回答
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)
}
于 2012-11-29T08:59:28.780 回答
0

我找到了闪烁/消失的 3D 图形问题的根源。在 OpenGL 中,如果在不提供纹理的情况下绘制几何图形,则必须禁用纹理,所以我写了

glDisable(GL_TEXTURE_2D)

最后,display_ready3d(...)现在一切都在做它必须做的事情。我在这里阅读另一个相关问题的答案时意外地意识到了这个失败:https ://gamedev.stackexchange.com/questions/44437/lwjgl-mixing-2d-and-3d 还要感谢datenwolfand bluenote10,您的帮助非常宝贵。

于 2012-11-29T22:31:23.743 回答