gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 13:39:44 26 4
gpt4 key购买 nike

我有这个代码:https://github.com/magicgoose/lwjgl-nifty-test-project当我只渲染 GUI 时,它的工作方式与预期一致。当我尝试渲染三角形(在透视投影中)然后渲染 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()
}

我做错了什么?我尝试搜索带有 nifty-gui 和背景 3d 图形的工作示例,但没有成功。

更新 1

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

更新2

我向 3D 部分添加了一些 Action (请参阅存储库中的更新),现在我可以看到三角形几乎不可见(它看起来像 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)
}

display_ready2d 就在绘制 GUI 之前,display_ready3d 在draw_something 之前。另外,您必须将清除命令放在那里,这也需要覆盖深度缓冲区;此外,透明颜色的 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()
}

关于scala - 如何使用 2d GUI (nifty-gui) 正确渲染 3d 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13615931/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com