OpenGL奇怪的渲染行为(闪烁的面孔)

Nic*_*ola 2 c++ opengl qt render assimp

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++;
}

}
Run Code Online (Sandbox Code Playgroud)

And*_*urg 7

12.040深度缓冲似乎有效,但是多边形似乎会通过它们前面的多边形渗出.这是怎么回事?

您可能已经严格限制深度缓冲区精度的方式配置了zNear和zFar剪裁平面.通常,这是由zNear剪切平面值太接近0.0引起的.

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

  • @nicolagenesin:我建议你也减少你的'200000`,看起来价值相当高,但当然这取决于OpenGL单元中对象的大小.您必须回答的问题是:"在您的应用程序中看到这么远是否有用?" (2认同)