Objekt wird nicht immer gezeichnet



  • Guten Abend,

    ich hoffe ihr könnt mir ein zweites mal bei meinem Problem helfen...

    Es besteht darin, das meine Grafikengine zwar irgendwie funktioniert, aber irgendwie auch wieder nicht. Im Moment wird, zu testzwecken, nur ein simples weißes Dreieck gezeichnet und die FPS ausgegeben.

    Das Problem ist nur, das dieses Dreieck nicht bei jedem meiner Testkandidaten gezeichnet wird, die FPS Ausgabe jedoch immer. Ich kann mir nicht ausmalen, woran das liegen könnte.

    Ich hab mal testweise eine printf Ausgabe in die Zeichenschleife gesetzt, sie wird durchlaufen. Auch wird eine Displaylist erstellt, welche das Dreieck enthält, sonst würde ich eine Fehlermeldung bekommen, das diese nicht erstellt werden konnte.

    Im Moment sieht es so aus, dass das Dreieck bei 4 Leuten funktioniert (3 mal davon bei mir selbst, jedoch jeweils unter einem anderen OS) und bei 3 Leuten nicht.

    Hättet ihr vll eine Idee, woran das liegen könnte? Wenn ihr dafür irgendwas an Code o.ä. braucht, reich ich den gerne nach.

    Achja... eine exe zum selbst Testen wär vll nicht schlecht... dann könnt ihr mir auch sagen, ob bei euch ein Dreieck ist oder nicht 😃
    Link

    Vielen Dank schonmal 🙂

    MfG
    Shelling



  • Dreieck ist vorhanden.
    58-60 FPS
    Windows Vista

    zum problem selber kann leider nichts sagen (evtl. mit code, aber auch dann nicht sicher...)

    Mfg



  • Ok, dann rück ich mal etwas Code raus, jedenfalls den, der für das Zeichnen und erstellen eines Objektes verantwortlich ist.

    Ein einzelnes Objekt erstellen:

    void CDevice::AddSingleObject(Vertex *Vertices, int Count)
    {	
    	C3DObject *NewObject;
    
    	NewObject=new C3DObject;
    
    	NewObject->CreateMeshes(1);
    	NewObject->Meshes[0].CreateMesh(Vertices,Count);
    
    	NewObject->Next=NULL;
    	NewObject->Prev=LastObject;
    	LastObject->Next=NewObject;
    	LastObject=NewObject;
    
    }
    

    Dann einmal das Erstellen des Meshes:

    void CMesh::CreateMesh(Vertex *Vertices, int Count)
    {	
    	int i;
    
    	this->Vertices=new Vertex[Count];
    	AmountVertices=Count;
    
    	for(i=0;i<Count;i++) 
    	{
    		this->Vertices[i].X=Vertices->X;
    		this->Vertices[i].Y=Vertices->Y;
    		this->Vertices[i].Z=Vertices->Z;
    		Vertices++;
    	}
    }
    

    Die Zeichenfunktion:

    GLvoid COpenGL::Draw()
    {
    	/*
    	Die Render Routine der Engine, hier wird alles gezeichnet
    	*/
    	int fps=0, a;
    
    	a=time(NULL);
    
    	while(1)
    	{
    		glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    		glLoadIdentity();
    
    		glPushMatrix();
    
    		glTranslatef(0.0f,0.0f,-6.0f);		
    
    		while(this->CurObject->Next!=NULL)
    		{
    			if(!run) return;
    
    			this->CurObject=this->CurObject->Next;
    
    			if(this->CurObject->Meshes[0].Object==NULL)
    			{
    				if(!this->CurObject->Meshes[0].BuildDisplayList()) MessageBox(NULL,"Couldn't create Display List","Runtime Error", MB_OK | MB_ICONERROR);
    			}
    
    			glCallList(this->CurObject->Meshes[0].Object);
    
    		}
    
    		this->CurObject=this->Root;
    
    		glPopMatrix();
    		fps++;
    
    		if(a!=time(NULL))
    		{
    			a=time(NULL);
    			this->FPSOutput=fps;
    			fps=0;
    		}
    
    		if(this->FPS)
    		{
    			glDisable(GL_DEPTH_TEST);
    			glTranslatef(0.0f,0.0f,-1.0f);
    			glRasterPos2f(-0.55f, 0.33f);
    			glPrint("FPS: %d",this->FPSOutput);	
    
    			glEnable(GL_DEPTH_TEST);
    		}
    
    		SwapBuffers(hDC);
    
    	}
    }
    

    Und noch das erstellen der Displaylist:

    bool CMesh::BuildDisplayList()
    {
    	int i;
    
    	Object=glGenLists(1);
    
    	glNewList(this->Object,GL_COMPILE);
    
    	glBegin(GL_TRIANGLES);
    
    		for(i=0;i<AmountVertices;i++) 
    		{
    			   glVertex3f(this->Vertices[i].X,this->Vertices[i].Y,this->Vertices[i].Z);
    		}
    
    	glEnd();
    
    	glEndList();
    
    	return (this->Object==NULL) ? false : true;
    }
    

    In der Zeichenfunktion werd ich später zwar noch ein paar Funktionsaufrufe in die 2. Schleife schieben müssen, aber das sollte bei nur 1 Objekt nichts ändern. Zumal es ja manchmal dargestellt wird...

    //EDIT:

    Ok, irgendwie hab ich gehofft, dass es an

    this->Vertices[i].X=Vertices->X;
    this->Vertices[i].Y=Vertices->Y;
    this->Vertices[i].Z=Vertices->Z;
    

    liegen würde, hab es ein wenig abgeändert, vll ist da was durcheinander gekommen. Aber das hat das Problem leider nicht beseitigt. Jetzt bin ich vollkommen ratlos, hab noch eine Ausgabe der einzelnen Vetices eingebaut, vll hilft das ja ein wenig...

    Link ist der gleiche, setz ich hier aber nochmal rein: Link

    MfG
    Shelling



  • Musste mir leider durch einen dummen Fehler meinerseits einen neuen Account anlegen, konnte ich leider nicht mehr den alten Post editieren.

    Jedenfalls konnte ich ein paar Fortschritte machen, falls man das so nennen kann.

    Ich weiß inzwischen das es an der Displaylist liegt. Das komische jedoch ist, das der FPS Zähler ebenfalls auf Displaylisten basiert, aber bei jedem immer dargestellt wird. Es kann also nicht sein, das Displaylisten von dem Rechner nicht unterstützt werden. Zudem funktionierte bei diesen Leuten ein anderes Programm, welches ebenfalls Displaylisten benutzt, ohne Probleme. Nur mein Dreieck will bei diesen Leuten einfach nicht auftauchen.

    Fällt euch noch irgendwas ein? Ich bin mit meinem Latein am Ende...

    MfG,
    Shelling


Anmelden zum Antworten