2013-06-22 105 views
2

PRE:我正在使用Assimp(Open Asset Import)庫導入.3ds文件。網格用法線和材質渲染。使用Qt。我們嘗試過的所有電腦上的驅動程序都是最新的。OpenGL奇怪的渲染行爲(閃爍的面孔)

POST:當我圍繞物體旋轉時,使用相機,我可以看到一些網格的臉部閃爍。

使用Assimp的render()方法(從A. wsite下載的示例代碼)也會發生同樣的情況。

1)奇怪的是,它通常發生在小尺寸的.3ds上,而從不會發生在大的尺寸上。 2)如果我真的很近,那就沒有任何工件了。我是最遠的,我看到的工件越多。

這是.3ds問題還是我的?大.3DS的

例(20MB)小.3DS的 e

例(3MB) enter image description here

我貼我在這裏的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++; 
} 

} 

回答

7

12.040深度緩衝似乎工作,但多邊形似乎流過面前的多邊形。這是怎麼回事?

您可能以嚴重限制深度緩衝精度的方式配置zNear和zFar剪切平面。一般來說,這是由接近0.0的zNear剪切平面值造成的。

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

+0

gluPerspective(FOV,比率,0.1F,20000); 以gluPerspective(fov,ratio,5.0f,20000);解決了這個問題,非常感謝你 – Nicola

+2

@nicolagenesin:我建議減少你的'200000',看起來是一個相當高的值,但當然這取決於你的對象在OpenGL單元中的大小。你必須回答的問題是:「在你的應用程序中看到這個有用嗎?」 – Boris

+1

我從互聯網上下載了一些.3ds文件,其中2個像10k一樣大。所以,如果我想完全看到它們,我必須像15K遠離origin.B ut你說的是一個聰明的東西:我可以在場景加載期間對它進行dinamycally排列(我知道模型有多大 - >用某種算法設置zFar)。謝謝 – Nicola