首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用2d GUI (nifty-gui)正确渲染3d对象?

如何使用2d GUI (nifty-gui)正确渲染3d对象?
EN

Stack Overflow用户
提问于 2012-11-29 06:58:36
回答 3查看 1K关注 0票数 4

我有这样的代码:https://github.com/magicgoose/lwjgl-nifty-test-project当我只渲染图形用户界面时,它就像预期的那样工作。当我尝试渲染三角形(在透视投影中),然后渲染GUI时,一切都失败了,甚至GUI也不能正确渲染--我只得到黑色背景上的字母。(如果我在display(...)方法中取消对draw_something()语句的注释,就会发生这种情况)

代码语言:javascript
复制
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)。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-11-29 08:25:33

必须在正交投影和透视投影之间切换。为此,准备了两个函数:display_ready2d (设置正交投影矩阵)和display_ready3d (设置透视投影)。

不幸的是,display_ready3d函数在应用其更改之前不会重置矩阵堆栈。在调用gluPerspective之前,必须添加一个glLoadIdentity。此外,您不应该清除这些函数中的帧缓冲区,因为您希望能够在矩阵设置之间切换。因此,将其更改为:

代码语言:javascript
复制
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(除非您已经创建了一个透明窗口)。

代码语言:javascript
复制
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()
}
票数 4
EN

Stack Overflow用户

发布于 2012-11-29 16:59:29

我在我的一个项目中使用了以下代码来实现这一点。与datenwolf解决方案的主要区别在于,您不必在每次从GUI模式切换回来时都设置3D透视图。在我的例子中,我有一个相当复杂的3D透视设置,因此,依靠这种推/弹矩阵方法更方便。

如果在3D模式中启用了闪电,您可能还需要考虑关闭GUI模式的闪电,以确保GUI颜色不受灯光的影响。

代码语言:javascript
复制
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)
}
票数 1
EN

Stack Overflow用户

发布于 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还要感谢datenwolfbluenote10,您的帮助是无价的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13615931

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档