scala – 如何正确渲染带有2d GUI(nifty-gui)的3d对象?
我有这个代码:
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() } 我做错了什么? 更新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() } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |