c – 使用OpenGL渲染3D对象(.obj文件)时闪烁
在尝试使用OpenGL(和GLFW库)渲染3D对象时,模型会经历大量闪烁.我正在使用我自己编写的库读取.obj文件.
下面写的是我的渲染功能: 我使用here的.obj文件来测试程序.现在,该程序不支持法线和纹理,这不是问题,因为网站上的大多数模型都没有它们.此外,(现在)它只读取“123.obj”所以该文件不应该被命名为其他任何东西.它只接受一个空间,而不是更多. float render() { glfwSetTime(0.0f); int win_width; int win_height; glfwGetWindowSize(&win_width,&win_height); float win_aspect = (float)win_width / (float)win_height; glViewport(0,win_width,win_height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(90,win_aspect,100.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(0,50.0,0.0,1.0,0.0); glEnable(GL_DEPTH); glEnable(GL_DEPTH_TEST); glEnable(GL_COLOR_MATERIAL); glEnable(GL_NORMALIZE); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glRotatef(angle,1,0); glColor3f(0.0f,0.0f,0.0f); int index = 0; for(int a = 0; a < faces.size(); a++) { if(faces[a].vertices.size() == 3) { glBegin(GL_TRIANGLES); } else { glBegin(GL_QUADS); } for(int b = 0; b < faces[a].vertices.size(); b++) { index = faces[a].vertices[b]; glVertex3f(vertices[index].Dimensions[_x],vertices[index].Dimensions[_y],vertices[index].Dimensions[_z]); } glEnd(); } glfwSwapBuffers(); return (float)glfwGetTime(); 解决方法
这是问题所在
gluPerspective(90,100.0); 您不能将0设置为近距离,将其设置为大于0.1或1.0的值. gluPerspective(90,100.0); 当nearclip为0时,你的所有深度都被映射到z = 1,你就会得到z格斗. 编辑:如果你有兴趣,这里有一些关于透视深度的理论: 对于距摄像机x的给定距离,您的透视变换输出certian深度值z.在farclip处,此值将最大为1,而在nearclip处它将为0. Diagram 当您将近距离设置为0时,您的曲线会发生剧烈扭曲,因此现在所有距离都会映射到z = 1. 因为这一切,你还应该尽量保持比率远:接近小于10000:1 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |