[OpenGL]Displaylist verschwunden

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.
Antworten
chewbo
Beiträge: 7
Registriert: 17.09.2009, 15:15

[OpenGL]Displaylist verschwunden

Beitrag von chewbo »

Hallo. Ich hab folgenden Problem:

Ich habe eine Displaylist in einer Klasse erstellt (bessergesagt im Konstruktor), und die Nummer der Displaylist zugehörig gespeichert.

In meiner Main Funktion schiebe ich nun eine Instanz in einen globalen Vektor.

Und in der glut Renderfunktion rufe ich dann die entsprechende Displaylist auf.

Das Ergebnis ist ein leeres Bild. Erstelle ich jedoch in der glut Renderfunktion eine Instanz und rufe die zugehörige Displaylist auf, klappt es ohne Probleme. Woran liegt das?

chewbo
Benutzeravatar
Krishty
Establishment
Beiträge: 8268
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: [OpenGL]Displaylist verschwunden

Beitrag von Krishty »

chewbo hat geschrieben:In meiner Main Funktion schiebe ich nun eine Instanz in einen globalen Vektor.
Hast du einen ordentlichen Kopierkonstruktor (Deep-Copy) definiert? Übergibst du das Objekt selbst, oder legst du es auf dem Heap an und übergibst einen Zeiger an den Vektor?

Gruß, Ky
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Aramis
Moderator
Beiträge: 1458
Registriert: 25.02.2009, 19:50
Echter Name: Alexander Gessler
Wohnort: 2016
Kontaktdaten:

Re: [OpenGL]Displaylist verschwunden

Beitrag von Aramis »

Und wenn das nichts hilft, poste doch einfach etwas Code :-)
chewbo
Beiträge: 7
Registriert: 17.09.2009, 15:15

Re: [OpenGL]Displaylist verschwunden

Beitrag von chewbo »

Ist das Kopieren der Klasse nicht unerheblich, da die Displaylist kompiliert wird und in irgendeinen Speicher geschoben wird? Ich kann die Displaylist ja nicht manuell speichern.
Die Nummer der Displaylist wird richtig kopiert. Ist ja nur ein unsigned int.

Code: Alles auswählen

Model::Model(const std::string& pFile)
{
	
	DispList=glGenLists(1);
  Assimp::Importer importer;


	const aiScene* m_pAIScene=importer.ReadFile( pFile, 
        aiProcess_CalcTangentSpace       | 
        aiProcess_Triangulate            |
        aiProcess_JoinIdenticalVertices  |
        aiProcess_SortByPType);

  if( !m_pAIScene)
  {
	  std::cout<<"Konnte Modell nicht laden"<<std::endl;
  }


glNewList(DispList,GL_COMPILE);
	for(unsigned int i = 0; i < m_pAIScene->mNumMeshes; i++) {
        for(unsigned int j = 0; j < m_pAIScene->mMeshes[i]->mNumFaces; j++) {
            if(m_pAIScene->mMeshes[i]->mFaces[j].mNumIndices == 3) {
                glBegin(GL_TRIANGLES);
                    glVertex3f(m_pAIScene->mMeshes[i]->mVertices[m_pAIScene->mMeshes[i]->mFaces[j].mIndices[0]].x / 200, 
                        m_pAIScene->mMeshes[i]->mVertices[m_pAIScene->mMeshes[i]->mFaces[j].mIndices[0]].y / 200,
                        m_pAIScene->mMeshes[i]->mVertices[m_pAIScene->mMeshes[i]->mFaces[j].mIndices[0]].z / 200);
                    glVertex3f(m_pAIScene->mMeshes[i]->mVertices[m_pAIScene->mMeshes[i]->mFaces[j].mIndices[1]].x / 200, 
                        m_pAIScene->mMeshes[i]->mVertices[m_pAIScene->mMeshes[i]->mFaces[j].mIndices[1]].y / 200,
                        m_pAIScene->mMeshes[i]->mVertices[m_pAIScene->mMeshes[i]->mFaces[j].mIndices[1]].z / 200);
                    glVertex3f(m_pAIScene->mMeshes[i]->mVertices[m_pAIScene->mMeshes[i]->mFaces[j].mIndices[2]].x / 200, 
                        m_pAIScene->mMeshes[i]->mVertices[m_pAIScene->mMeshes[i]->mFaces[j].mIndices[2]].y / 200,
                        m_pAIScene->mMeshes[i]->mVertices[m_pAIScene->mMeshes[i]->mFaces[j].mIndices[2]].z / 200);
                glEnd();
            } else {
                glBegin(GL_POLYGON);
                    for(unsigned int k = 0; k < m_pAIScene->mMeshes[i]->mFaces[j].mNumIndices; k++) {    
                        glVertex3f(m_pAIScene->mMeshes[i]->mVertices[m_pAIScene->mMeshes[i]->mFaces[j].mIndices[k]].x / 200, 
                            m_pAIScene->mMeshes[i]->mVertices[m_pAIScene->mMeshes[i]->mFaces[j].mIndices[k]].y / 200,
                            m_pAIScene->mMeshes[i]->mVertices[m_pAIScene->mMeshes[i]->mFaces[j].mIndices[k]].z / 200);
                    }
                glEnd();
            }
        }
	}
glEndList();
		
}

Code: Alles auswählen

void RenderScene(void){
glCallList(Modelle[0].DispList);
}
So in etwa. Modell ist in der Main erstellt und in den Vector Modelle geschoben worden, der global ist.
Benutzeravatar
Aramis
Moderator
Beiträge: 1458
Registriert: 25.02.2009, 19:50
Echter Name: Alexander Gessler
Wohnort: 2016
Kontaktdaten:

Re: [OpenGL]Displaylist verschwunden

Beitrag von Aramis »

Hast du vll. einen Destruktor definiert, der die Displayliste weglöscht, womit nur noch ein für GL bedeutungsloser Index kopiert würde?
chewbo
Beiträge: 7
Registriert: 17.09.2009, 15:15

Re: [OpenGL]Displaylist verschwunden

Beitrag von chewbo »

Der Destruktor ist leer. in der Klasse steht sowieso nichts ausser dem Integer, der sagt welche Displaylist zu dem Objekt gehört. Und die Displaylist wird halt im Konstruktor erstellt. Und das wird sie auch, da der Debugger dadurch läuft
chewbo
Beiträge: 7
Registriert: 17.09.2009, 15:15

[Gelöst]Re: [OpenGL]Displaylist verschwunden

Beitrag von chewbo »

Des Rätsels Lösung ist folgendes:
Da ich das Objekt direkt am Anfang in der Main erstellt hab, und OpenGL noch nicht initialisiert war, wurde ein Fehlercode ausgegeben, der das Erstellen einer Displayliste verhindert hat.
Jetzt klappt es jedenfalls. Danke für die Mithilfe.

chewbo
Antworten