PRE:我正在使用Assimp(Open Asset Import)庫導入.3ds文件。網格用法線和材質渲染。使用Qt。我們嘗試過的所有電腦上的驅動程序都是最新的。OpenGL奇怪的渲染行爲(閃爍的面孔)
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++;
}
}
gluPerspective(FOV,比率,0.1F,20000); 以gluPerspective(fov,ratio,5.0f,20000);解決了這個問題,非常感謝你 – Nicola
@nicolagenesin:我建議減少你的'200000',看起來是一個相當高的值,但當然這取決於你的對象在OpenGL單元中的大小。你必須回答的問題是:「在你的應用程序中看到這個有用嗎?」 – Boris
我從互聯網上下載了一些.3ds文件,其中2個像10k一樣大。所以,如果我想完全看到它們,我必須像15K遠離origin.B ut你說的是一個聰明的東西:我可以在場景加載期間對它進行dinamycally排列(我知道模型有多大 - >用某種算法設置zFar)。謝謝 – Nicola