Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!
Werbeanzeige
Nur mal so aus Interesse: Wo genau hast du da ein Problem ?Zitat
Damit disqualifizierst du mehr oder weniger OpenGL an sich schon von vorn herein. Auch wenn OpenGL eine objektorientierte API ist, so sorgt, zumindest meiner Erfahrung nach, das kaputte Objektmodell leider dafür, dass es praktisch unmöglich ist, OpenGL Objekte in herkömmlichen Klassen zu wrappen. Ich hab jedenfalls bis dato noch keine brauchbare Lösung gefunden. Wenn jemand eine kennt, so wäre ich sehr daran interessiert...
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »dot« (11.07.2012, 13:51)
Nur mal so aus Interesse: Wo genau hast du da ein Problem ?
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
class Texture { public: void update(...., const byte* data) { glBindTexture // !! wichtig !! /// ... glTexSubImage2D(...) // arbeitet auf EINEM texturobject, glBindTexture selektiert das korrekte } }; Texture tex1, tex2; tex1.update(...); /// Problem: wieso ist tex1 jetzt aktiv gebunden? wurde doch nur geupdated? |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 |
class Texture { public: void update(...., const byte* data) { m_D3DTexture->LockRect(...) // arbeitet auf DEM texturobject das mit der Instanz assoziiert wird } }; Texture tex1, tex2; tex1.update(...); |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
class Texture { public: void update(...., const byte* data) { glBindTexture // !! wichtig !! // // ... glTexSubImage2D(...) // arbeitet auf EINEM texturobject, glBindTexture selektiert das korrekte // ... glBindTexture(..., 0); // Das aktuell gebundene Objekt wird entfernt ! } }; Texture tex1, tex2; tex1.update(...); /// Kein Problem mehr weil keine Textur gebunden |
Zitat
// ...
glBindTexture(..., 0); // Das aktuell gebundene Objekt wird entfernt !
Dieser Beitrag wurde bereits 11 mal editiert, zuletzt von »dot« (10.07.2012, 14:23)
Zitat
// ...
glBindTexture(..., 0); // Das aktuell gebundene Objekt wird entfernt !
Was ist wenn aber wenn Textur A gebunden war und nach dem Update auf einmal keine Textur mehr gebunden ist? Du müsstest dir also erstmal merken was für eine Textur gerade aktiv war und diese dann erneut binden. Das ist alles nicht besonders Intuitiv und schreit quasi nach spanennden Debugsessions.
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
GLuint GetCurrent() const { GLint current; glCheck(glGetIntegerv(GL_TEXTURE_BINDING_2D, ¤t)); return current; } void _ReBind(GLuint previous_texture) const { if (previous_texture != this._texture) { glCheck(glBindTexture(GL_TEXTURE_2D, previous_texture)); } } |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 |
const GLuint previous_texture = this.GetCurrent(); this.Bind(); const GLenum smooth = enable ? GL_LINEAR : GL_NEAREST; glCheck(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, smooth)); glCheck(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, smooth)); this._ReBind(previous_texture); |
Macht es überhaupt Sinn, sich zu merken, welche Textur aktiv ist? Ich kann mir kaum vorstellen, dass innerhalb der API überhaupt nichts optimiert wird und alles direkt an den Treiber weitergereicht wird, müsste nicht diese Abfrage dann schon in BindTexture stattfinden? Dann könnte man ja einfach das Bind in jede Funktion packen und schon hätte man seine Kapselung ganz genauso wie in DX.
Zitat
finde ich jetzt nicht weiter dramatisch.
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »David_pb« (10.07.2012, 14:46)
Macht es überhaupt Sinn, sich zu merken, welche Textur aktiv ist? Ich kann mir kaum vorstellen, dass innerhalb der API überhaupt nichts optimiert wird und alles direkt an den Treiber weitergereicht wird, müsste nicht diese Abfrage dann schon in BindTexture stattfinden? Dann könnte man ja einfach das Bind in jede Funktion packen und schon hätte man seine Kapselung ganz genauso wie in DX.
Zitat
// ...
glBindTexture(..., 0); // Das aktuell gebundene Objekt wird entfernt !
Was ist wenn aber wenn Textur A gebunden war und nach dem Update auf einmal keine Textur mehr gebunden ist? Du müsstest dir also erstmal merken was für eine Textur gerade aktiv war und diese dann erneut binden. Das ist alles nicht besonders Intuitiv und schreit quasi nach spanennden Debugsessions.
Naja, wenn du es schon in einer Klasse kapselst kannst du ja direkt vor Ort dafür sorgen, finde ich jetzt nicht weiter dramatisch.
Es geht eher darum, dass man dadurch (ungewollt) einen globalen Zustand ändert.
Wenn das Programm, das OpenGL benutzt, "sauber" arbeitet und nicht ständig die selbe Textur immer und immer wieder neu setzt, wäre so eine Abfrage unnötiger Aufwand.
Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von »dot« (10.07.2012, 15:04)
Werbeanzeige