加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 如何正确渲染带有2d GUI(nifty-gui)的3d对象?

发布时间:2020-12-16 10:03:41 所属栏目:安全 来源:网络整理
导读:我有这个代码: https://github.com/magicgoose/lwjgl-nifty-test-project 当我只渲染GUI时,它会像预期的那样工作.当我尝试渲染三角形(在透视投影中)然后渲染GUI时,一切都失败了,甚至GUI也无法正确渲染 – 我只得到黑色背景上的字母. (如果我取消注释,就会发
我有这个代码: https://github.com/magicgoose/lwjgl-nifty-test-project
当我只渲染GUI时,它会像预期的那样工作.当我尝试渲染三角形(在透视投影中)然后渲染GUI时,一切都失败了,甚至GUI也无法正确渲染 – 我只得到黑色背景上的字母. (如果我取消注释,就会发生这种情况
display(…)方法中的draw_something()语句)

private def draw_something() {
    glTranslatef(0,-20)
    glBegin(GL_TRIANGLES)
    glVertex3f(0.0f,1.0f,0.0f)
    glVertex3f(-1.0f,-1.0f,0.0f)
    glVertex3f(1.0f,0.0f)
    glEnd()
}

我做错了什么?
我尝试在背景上搜索漂亮的gui和3d图形的工作示例,但没有运气.

更新1

我已根据datenwolf的答案更改了代码,现在GUI渲染正常,但我只能看到白色三角形几毫秒(实际上它可能在单帧中?),似乎3D设置被“损坏” …只有当我渲染GUI时才会发生这种情况,如果我对gui.render(false)行进行注释,白色三角形会停留在屏幕上.

更新2

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

解决方法

您必须在正投影和透视投影之间切换.为此,准备了两个函数: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,width,height)
            glClearDepth(1.)
            glClearColor(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()
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读