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

ПРЕДВАРИТЕЛНО: Използвам библиотеката Assimp (Open Asset Import) за импортиране на .3ds файл. Мрежите се изобразяват с нормали и материали. Използвайки Qt. Драйверите са актуализирани на всички компютри, които пробвахме.

ПУБЛИКУВАНЕ: Когато се въртя около обектите с помощта на камерата, мога да видя, че лицата на някои мрежи трептят.

Същото се случва с помощта на метода render() на Assimp (примерен код, изтеглен от A. wsite).

1) Странното е, че обикновено се случва с малки размери .3ds, докато никога не се случва с големи.

2)Ако съм наистина близо, няма артефакти. Колкото по-далеч съм, толкова повече артефакти виждам.

Проблемът .3ds ли е или мой?

Пример за голям .3ds (20MB) e

Пример за малък .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++;
}

}

person Nicola    schedule 22.06.2013    source източник


Отговори (1)


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

Може да сте конфигурирали вашите zNear и zFar изрязващи равнини по начин, който силно ограничава прецизността на вашия буфер за дълбочина. Обикновено това се причинява от стойност на zNear отрязваща равнина, която е твърде близка до 0,0.

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

person Andreas Haferburg    schedule 22.06.2013
comment
gluPerspective(fov,ratio,0.1f,20000); към gluPerspective(fov,ratio,5.0f,20000); реши проблема, благодаря ви много - person Nicola; 23.06.2013
comment
@nicolagenesin: Бих предложил да намалите и вашия 200000, изглежда доста висока стойност, но разбира се зависи от размера на вашия обект в OpenGL единици. Въпросът, на който трябва да отговорите, е: полезно ли е във вашето приложение да виждате толкова далеч? - person Boris Dalstein; 24.06.2013
comment
Изтеглих някои .3ds файлове от интернет и 2 от тях са големи като 10k. Така че, ако искам да ги видя изцяло, трябва да съм на около 15k далеч от произхода. Но това, което казахте, е умно нещо: аз може да подреди динамично zFar по време на зареждане на сцена (знам колко голям е моделът -› задайте zFar с някакъв алгоритъм). Благодаря ти - person Nicola; 24.06.2013