我是OpenGL的新手,我试图为我的学士论文导入一个OBJ文件。 原则上它是有效的,但遗憾的是面部存在问题 我第一次看到使用一个大的obj文件(约15.000个顶点) - 其中一些不能正确渲染。 我已经尝试用
修复它glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
但它虽然没有奏效。
对此感到沮丧,我写了一个简单的立方体模型对象文件。 (参见下面链接中的quader.obj)
我尝试用我的" Load" -function导入它(参见ModelObj.h和ModelObj.cpp) 但是根据物体的位置,有一些面孔缺失。
(立方体的图像,ModelObj-class和quader.obj都压缩here)。
加载顶点后,显示功能的导入如下所示:
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, obj.getFaces());
glNormalPointer(GL_FLOAT, 0, obj.getNormals());
glDrawArrays(GL_TRIANGLES, 0, obj.getTotalConnTriangles() );
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_NORMAL_ARRAY);
注意:我也试过渲染相同的简单立方体"手动"通过创建多边形 在我的显示功能中,它工作正常。
那么问题是什么?在哪里?
答案 0 :(得分:1)
我对您的代码有一些评论可能会导致错误的渲染
glVertexPointer再次检查参数。我记得你需要以下参数。
尺寸:一个顶点的点数
类型:点的类型(例如GL_FLOAT)
步幅:一个顶点和下一个顶点之间有多少字节(如果在同一个数组中存储颜色则交错)
指针:指向第一个顶点的指针(如果你的数组看起来像xyzxyzxyz那么它应该是0)
- 醇>
与glNormalPointer相同 - 检查参数
对于1和2我认为你的obj.getFaces()和obj.getNormals()是错误的
第三件事是你的渲染电话
glDrawArrays(GL_TRIANGLES,0,obj.getTotalConnTriangles());
当您将很多顶点作为输入时,您没有说明有多少个三角形,但是您说要渲染多少个标记,因此您应该说
obj.getTotalConnTriangles()* 3
答案 1 :(得分:1)
我得到了解决方案: 好吧 - 渲染过程中没有任何问题 - 这是因为 面部定义中顶点数的顺序。 通常你需要顶点顺时针(想象三角形的顶视图) 如果你将它们与逆时针面部定义混合在一起,OpenGL将在另一面构建表面。 HTH