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
[OpenGL]Displaylist verschwunden
- Krishty
- Establishment
- Beiträge: 8350
- Registriert: 26.02.2009, 11:18
- Benutzertext: state is the enemy
- Kontaktdaten:
Re: [OpenGL]Displaylist verschwunden
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?chewbo hat geschrieben:In meiner Main Funktion schiebe ich nun eine Instanz in einen globalen Vektor.
Gruß, Ky
- Aramis
- Moderator
- Beiträge: 1458
- Registriert: 25.02.2009, 19:50
- Echter Name: Alexander Gessler
- Wohnort: 2016
- Kontaktdaten:
Re: [OpenGL]Displaylist verschwunden
Und wenn das nichts hilft, poste doch einfach etwas Code :-)
Re: [OpenGL]Displaylist verschwunden
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.
So in etwa. Modell ist in der Main erstellt und in den Vector Modelle geschoben worden, der global ist.
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);
}
- Aramis
- Moderator
- Beiträge: 1458
- Registriert: 25.02.2009, 19:50
- Echter Name: Alexander Gessler
- Wohnort: 2016
- Kontaktdaten:
Re: [OpenGL]Displaylist verschwunden
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
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
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
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