Registriert: Mo Nov 24, 2003 21:28 Beiträge: 28 Wohnort: Kiel
nochmal ne kleine Frage:
Wenn ich mit glGenTextures Namen für meine Texturen vergeben und den ganzen anderen krempel mache (wie im Tut beschrieben), so daß ich nur noch ein glBindTexture() machen muss bevor ich ein Objekt zeichne:
Sind die Textur-Namen eigentlich über das gesamte Programm hinweg bekannt oder nur in der Klasse in der ich sie generiert hab?
Ich will meinen das sie im gesamten Proggi bekannt sind, aber ich frag lieber noch mal nach.
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Meinst du gültig?
Also mit glGentextures bekommst du ein Cardinal was deine TexturenID (name) wiederspiegelt. Je nachdem was du damit machst (wo du sie zum lesen freigibst etc) ist sie dort bekannt oder ebend nicht. Das verhält sich aber genau wie mit allen anderen Variablen. Entweder du nimmst Globale variablen dafür oder du machst eine art Texturmanager der die ID's kennt und auf den jeder zugreifen kann. Zum Letzteren würde ich auch eher raten.
Gültig ist diese ID aber solange bis der RenderContext wieder zerstörrt wird. Ein Klassisches Beispiel ist dafür das Schalten in den Vollbildmodus zur Laufzeit. Dafür musst du OpenGL neu initialisieren und dann musst du alle Texturen neu Laden weil sie vom Treiber zerstörrt wurden.
PS: Hast du vor nen Texturloader zu schreiben? Anderfalls würde ich empfehlen einen bereits Existierenden zu benutzen. Die gibbet mittlerweile (ich bin da auch mit schuld dran. ) in jeder erdenklichen Fassung.
Registriert: Mo Nov 24, 2003 21:28 Beiträge: 28 Wohnort: Kiel
Textureloader schreiben nicht direkt.
Mal schematisch: Nehmen wir an, ich hab zwei Klassen, A und B.
In der Klasse A lade ich nun die Texture mittels
glGenTextures(), glBindTexture(), gluBuild2DMipmaps und anderen Textureparametern.
Da heisst ja, daß anschließend meine Texture unter dem "Namen", den ich in glGenTextures() angegeben hab, bekannt ist. Ich kann sie also beim Zeichnen meines Objektes mit
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, texName);
// Objekt zeichnen
glDisable(GL_TEXTURE_2D);
abrufen.
Meine Frage ist, kann ich den für die Texture vergebenen Namen einfach so auch in Klasse B benutzen (also ist die Texture unter dem Namen auch in B bekannt) oder muss ich den Namen erst noch übergeben?
Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
Wenn TexName global deklariert ist, dann spielts keine Rolle wo du auf dein Texturenobjekt zurückgreifen willst, egal in welcher Klasse oder welcher Funktion.
Der Name ist eine ganz normale (unsigned) Integerzahl - sagen wir mal 115. Sobald du die Textur mit dem Namen 115 bindest, weiß OpenGL um welche Textur es sich handelt - das hat mit deiner Programmiersprache, bzw. ob du Klassen verwendest oder nicht, überhaupt nichts zu tun.
Mit glGenTextures vergibst du auch keine Namen, vielmehr forderst du von OpenGL eine Reihe von freien Namen an, die du dann mit Texturen & Texturparametern befüllen kannst.
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Du hast zwei Klassen.
Klasse a // geniert die Textur
Klasse b // Möchte gerne die Textur benutzen.
Also Entweder du machst es so wie SOS vorgeschlagen hat. Mittels einer globalen Variable.
Im Falle eines klassenbasierten Loaders (er beinhaltet die TexturID) hast du mehrere Möglichkeiten.
- Klasse b beinhaltet eine Variable in der die TexturID abgelegt wird
- Klasse b beinhaltet eine Referenz auf die erstellte Klasse a und hat Zugriff auf die TexturID
- Oder Klasse b erstellt die Klasse a und benutzt sie somit. Hat also die einzigste Referenz auf Klasse a und entscheidet über leben oder Tot.
Aber im Endeffekt spielt es keine Rolle wie du es anstellst die Hauptsache ist, dass die TexturID irgendwie in Klasse b bekannt ist. (Zuweisung oder global verfügbare Variablen)
Oder kapsel die OpenGL Texturen in einer Klasse, so daß die Texture in dem gleichen Objekt erstellt,gebunden,gelöscht und geladen wird,so daß du nur das Objekt hast und die TextureID für den Rest der Anwendung keine Rolle spielt.
Mitglieder in diesem Forum: 0 Mitglieder und 6 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.