Seite 1 von 1

[OpenGL]Displaylist verschwunden

Verfasst: 21.09.2009, 18:25
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

Re: [OpenGL]Displaylist verschwunden

Verfasst: 21.09.2009, 18:50
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

Re: [OpenGL]Displaylist verschwunden

Verfasst: 21.09.2009, 19:05
von Aramis
Und wenn das nichts hilft, poste doch einfach etwas Code :-)

Re: [OpenGL]Displaylist verschwunden

Verfasst: 21.09.2009, 19:12
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.

Re: [OpenGL]Displaylist verschwunden

Verfasst: 21.09.2009, 20:10
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?

Re: [OpenGL]Displaylist verschwunden

Verfasst: 21.09.2009, 20:39
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

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

Verfasst: 21.09.2009, 21:15
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