PRE:我正在使用Assimp(开放资产导入)库来导入.3ds文件。网格使用法线和材质进行渲染。使用Qt。我们尝试的所有计算机上的驱动程序都是最新的。
POST:当我围绕物体旋转时,使用相机,我可以看到一些网格的脸部闪烁。
使用Assimp的render()方法(从A. wsite下载的示例代码)也是如此。
1)奇怪的是它通常以小尺寸.3ds发生,而从不发生在大尺寸上。
2)如果我真的很近,就没有人工制品。我是最远的,我看到的文物越多。
这是一个.3ds问题还是我的?
大.3ds(20MB)的示例
小.3ds(3MB)的示例
我在这里粘贴我的Draw()函数(使用glLists但我无法摆脱它们):
void Preview::BuildObjectsLists(Scene *sc,GLenum mode){
QHash<QString, SceneObject*>& hash=sc->getObj();
int counter =0;
for (QHash<QString,SceneObject*>::ConstIterator i = hash.begin();i!=hash.end();++i) {
glNewList(index-counter, GL_COMPILE);
Mesh* p = dynamic_cast<Mesh*>(i.value());
if(p){
Matrix4x4& a=p->getTrasformation();
a.transpose();
if(mode==GL_SELECT){
glPushName(counter);
}
glPushMatrix();
glMultMatrixf((float*) &(a.values));
applyMaterial(p->getMat());
QList<Face>& faccie=p->getFaces();
int numerofacce=faccie.count();
QList<Vector3D>& normals =p->getNormals();
bool hasNormals=(!(normals.isEmpty()));
if(hasNormals) glEnable(GL_LIGHTING);
else glDisable(GL_LIGHTING);
for (int t = 0; t < numerofacce; ++t) {
Face& f = faccie[t];
GLenum face_mode;
Vector3D* lista=f.arrayVertici;
int* listaNorm=f.normalIndex;
switch(f.numVertici) {
case 1:
face_mode = GL_POINTS;
glBegin(face_mode);
if(hasNormals)
glNormal3fv(&((normals[listaNorm[0]]).pos[0]));
glVertex3fv(&lista[0].pos[0]);
break;
case 2:
face_mode = GL_LINES;
glBegin(face_mode);
if(hasNormals){
glNormal3fv(&((normals[(f.normalIndex)[0]]).pos[0]));
glVertex3fv(&lista[0].pos[0]);
glNormal3fv(&((normals[(f.normalIndex)[1]]).pos[0]));
glVertex3fv(&lista[1].pos[0]);
}
else{
glVertex3fv(&lista[0].pos[0]);
glVertex3fv(&lista[1].pos[0]);
}
break;
case 3:
face_mode = GL_TRIANGLES;
glBegin(face_mode);
if(hasNormals){
glNormal3fv(&normals[(f.normalIndex)[0]].pos[0]);
glVertex3fv(&lista[0].pos[0]);
glNormal3fv(&normals[(f.normalIndex)[1]].pos[0]);
glVertex3fv(&lista[1].pos[0]);
glNormal3fv(&normals[(f.normalIndex)[2]].pos[0]);
glVertex3fv(&lista[2].pos[0]);
}
else{
glVertex3fv(&lista[0].pos[0]);
glVertex3fv(&lista[1].pos[0]);
glVertex3fv(&lista[2].pos[0]);
}
break;
default: face_mode = GL_POLYGON; break;
}
glEnd();
}
glPopMatrix();
}
if(mode==GL_SELECT) glPopName();
glEndList();
counter++;
}
}
答案 0 :(得分:7)
12.040深度缓冲似乎有效,但多边形似乎会通过它们前面的多边形渗透。发生了什么?
您可能以严格限制深度缓冲区精度的方式配置了zNear和zFar剪裁平面。通常,这是由zNear剪切平面值太接近0.0引起的。
http://www.opengl.org/archives/resources/faq/technical/depthbuffer.htm