在尝试使用OpenGL(和GLFW库)渲染3D对象时,模型会经历许多闪烁。 我正在阅读使用我自己写的库的.obj
文件。
写在下面是我的渲染function:不幸的是,为了理解如何input面和顶点,我将不得不提供所有我的代码,链接:压缩代码以及可执行文件和示例.obj
: Source
我从这里使用.obj文件来testing程序。 目前,该scheme不支持法线和纹理,这是不是一个问题,因为网站上的大多数模型没有他们。 另外,(现在)它只读取“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, 0, win_width, win_height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(90, win_aspect, 0, 100.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(0, 0, 50.0, 0, 0, 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 , 0 , 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, win_aspect, 0, 100.0);
你不能设置0作为你的nearclip,把它设置为更大的东西,如0.1或1.0。
gluPerspective(90, win_aspect, 1.0, 100.0);
当接近0的时候,你所有的深度都被映射到z = 1,并且你得到z的战斗。
编辑:如果你有兴趣,这里有一些关于透视深度的理论:
对于距相机x的给定距离,您的透视变换输出一个特定的深度值z。 在farclip中,这个值将是最大值1,而在接近零点时它将是0.然而,在这些值之间,关系并不像你所期望的那样是线性的。 曲线与下图类似:
图
当你将nearclip设置为0的极端时,你的曲线严重扭曲,所以现在所有的距离都映射到z = 1。
因为这一切,你也应该尽量保持这个比例:接近小于10000:1