OpenGL странное поведение рендеринга (мерцающие лица)

PRE: Я использую библиотеку Assimp (Open Asset Import) для импорта файла .3ds. Сетки отображаются с нормалями и материалами. Используя Qt. Драйверы в курсе всех компьютеров, которые мы пробовали.

СООБЩЕНИЕ: Когда я вращаюсь вокруг объектов, используя камеру, я вижу, что некоторые меши сеток мерцают.

То же самое происходит с использованием метода Assimp ‘render () (пример кода загружен с A. wsite).

1) Странно то, что обычно это происходит с маленьким размером .3ds, а с большими никогда не бывает.

2) Если я действительно близко, артефактов нет. Чем дальше я, тем больше артефактов я вижу.

Это проблема .3ds или моя?

Пример большого .3ds (20 МБ)
е

Пример малого .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++;
}

}

2

Решение

12.040 Буферизация глубины, кажется, работает, но полигоны, кажется, просачиваются через полигоны, которые находятся перед ними. В чем дело?

Возможно, вы настроили плоскости отсечения zNear и zFar таким образом, что это сильно ограничивает точность буфера глубины. Обычно это вызвано тем, что значение плоскости отсечения zNear слишком близко к 0.0.

http://www.opengl.org/archives/resources/faq/technical/depthbuffer.htm

7

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]