Registriert: Mi Apr 13, 2005 16:06 Beiträge: 67 Wohnort: Fulda
Hallo zusammen!
Erstmal möchte ich mich bei allen, die zum Entstehen dieser Seiten beigetragen haben (seien es die Tuts, das Forum oder das Wiki), für das tolle "Wissensportal" rund um OpenGL bedanken, das hier geschaffen wurde.
Ich selbst kam schon vor einiger Zeit über diese Seite zu OpenGL mit Delphi, habe mich allerdings damals nicht wirklich intensiv und ausführlich damit beschäftigt.
Da ich für eine Delphi-Anwendung (oder besser gesagt die Idee einer Anwendung, die Ausführung starb erstmal wegen Prioritätenverteilung zugunsten OGL) kürzlich gerne OpenGL zur Visualisierung genutzt hätte, mein Wissen aber einfach zu rudimentär war, bin ich inzwischen dabei, mich wirklich intensiv mit OGL zu beschäftigen.
Und zusammen mit dem aktuellen Redbook (1.4) ist diese Seite DER Einstiegspunkt dafür!
Soviel zur Vorgeschichte.
Ich habe ein Problem mit dem Cubemap-Tutorial:
Und zwar scheint dort allem Anschein nach die Cubemap in ein Array mit 6 Texturen abgelegt zu sein. Dies schließe ich jedenfalls aus folgendem Aufruf:
Des weiteren schreibt Sascha, dass Target in die textures.pas von Jan Horn eingefügt wurde, da dort bisher nur das Laden von 2D-Texturen möglich war.
Meine Behauptung: Das kann so doch gar nicht funktionieren (was es bei mir auch nicht tut). Meines Wissens besteht eine Cubemap aus genau einem (nicht sechs) Texturobjekt, an das die sechs Seiten der Cubemap einzeln mit glTexImage2D übergeben werden. Das Beispiel im Tut erzeugt jedoch mit LoadTexture aus der textures.pas bei jedem Aufruf eine eigene, also insgesamt sechs Texturen.
Richtig wäre demnach (der Code funktioniert bei mir):
Code:
var
TexData: Pointer;
begin
glGenTextures(1, @cubemap);
glBindTexture(GL_TEXTURE_CUBE_MAP, cubemap);
for i := 0 to 5 do
begin
// CubemapBild Nummer i in TexData laden
glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, 3,sizeX, sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TexData);
end;
end;
Da ich keinen Sourcecode zu dem Tutorial gefunden habe, konnte ich natürlich nicht überprüfen, ob es so doch irgendwie geht, aber wie gesagt: Bei mir hat diese Methode nicht funktioniert (falls ich sie nicht vollkommen falsch verstanden haben sollte, was ich allerdings nicht glaube).
Das zweite Beispiel ist auf jeden Fall richtig. Wie genau Jan Horns Texture Unit funktioniert, weiß ich nicht. Cubemaps haben aber nur ein Textureobjekt und man unterscheidet zwischen den Seiten anhand des Target Parameters.
Registriert: Mi Apr 13, 2005 16:06 Beiträge: 67 Wohnort: Fulda
LarsMiddendorf hat geschrieben:
Das zweite Beispiel ist auf jeden Fall richtig. Wie genau Jan Horns Texture Unit funktioniert, weiß ich nicht. Cubemaps haben aber nur ein Textureobjekt und man unterscheidet zwischen den Seiten anhand des Target Parameters.
Nun, die Funktion LoadTexture aus Jan Horns textures.pas nimmt als Parameter den Dateinamen einer Textur und gibt über einen Variablenparameter ein Texturobjekt zurück, in welches das Bild im Dateinamen abgelegt wurde. Fakt ist auf jeden Fall, dass ein Aufruf von LoadTexture ein neues Texturobjekt erzeugt.
Im Tutorial wird LoadTexture nun in der Schleife sechs mal aufgerufen, was zu 6 unabhängigen Texturobjekten führen muss und daher nicht funktionieren kann.
Der Code im Tutorial ist also entweder schlichtweg fehlerhaft oder (wenn die textures.pas so umgebaut wurde, dass es doch funktioniert) zumindest irreführend, da niemand, der den Originalquelltext (welchen ich nirgends gefunden habe) nicht einsehen kann, nicht versteht, wie denn so eine Cubemap nun geladen wird und warum das Tut im Endeffekt nicht funktioniert.
Registriert: Do Sep 25, 2003 15:56 Beiträge: 7810 Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Das sollte man dann infolge des Qualitätsoffensive auch nochmal auf die Todo Liste setzen. (Ob der Fehler von Sascha wohl absichtlich eingebaut wurde um Feedback zu erzeugen )
Der der sich darum kümmert (ich hoffe Magellan ist net allein) kann das ja mal vermerken.
PS: Ich hab mich schon gewundert wer der neue Wikischreiber war
_________________ Blog: kevin-fleischer.de und fbaingermany.com
Registriert: Mi Apr 13, 2005 16:06 Beiträge: 67 Wohnort: Fulda
Flash hat geschrieben:
Ob der Fehler von Sascha wohl absichtlich eingebaut wurde um Feedback zu erzeugen
Ich frage mich vor allem, warum der Fehler scheinbar noch nicht gefunden wurde. Denn soweit ich mich erinnern kann, gibts das Tut schon ziemlich lange.
Flash hat geschrieben:
PS: Ich hab mich schon gewundert wer der neue Wikischreiber war
Jep, das war ich. glGenTextures stand ziemlich weit oben in der Liste gewünschter Artikel und war nicht so schwer zu beschreiben, deshalb hab ich mir das mal vorgeknöpft.
Werde mich bemühen, weiterhin auch am Wiki mitzuarbeiten, auch wenn ich im Moment ein wenig im Stress bin in Sachen Abitur. Also nicht gleich Wunderwerke erwarten!
Registriert: Do Sep 25, 2003 15:56 Beiträge: 7810 Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Allein der Ansatz ist genau richtig. Niemand erwartet hier , dass jemand das WIKI alleine schreibt, aber hin und wider mal ein Artikelchen ... das wär schon ne dolle Sache.
Registriert: Do Sep 25, 2003 15:56 Beiträge: 7810 Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Anscheinend ist das doch noch net gängig. Beim Aufruf von Bind grig ich ne AccesViolation. Geklärt.
Es funktioniert noch nicht. Es kommt zwar kein Fehler und auch sonst nix böses, aber die Cubemap seh ich trotzdem net. Könnte eventuell daran liegen, dass ich mit Quadriken arbeite. Hier mal mein Rendercode:
Code:
procedure TForm1.Render;
var i : integer;
begin
//
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
Registriert: Mi Apr 13, 2005 16:06 Beiträge: 67 Wohnort: Fulda
Flash hat geschrieben:
müsste man doch nur vor dem zeichnen folgendes machen:
Code:
for i := 0 to 5 do
CubeMap[i].Bind;
gluCylinder(Q,1,1,1, 24,24);
Oder irr ich mich hier?
Damit ist doch beim Aufruf von gluCylinder(Q,1,1,1,24,24); nur die Textur CubeMap[5] aktiv, also nur eine Seite der Cubemap. Kann mir nicht vorstellen, dass das geht.
glBindTexture mit dem Target GL_TEXTURE_CUBE_MAP_POSITIV_X_ARB+i aufgerufen, was keine dafür gültige Konstante ist. glBindTexture erwartet als Target GL_TEXTURE_1D, GL_TEXTURE_2D, GL_TEXTURE_3D oder GL_TEXTURE_CUBE_MAP. die anderen Konstanten werden erst dann benötigt, wenn über glTexImage2D die Bilddaten der Textur bestimmt werden.
Bin also immer noch der Meinung, dass das nicht funktionieren kann.
Das stimmt. Beim Binden der Cubemap gibt man GL_TEXTURE_CUBE_MAP an und die Cubemap besteht aus alles sechs Seiten, die nicht einzeln gebunden werden können. Bei glTexImage2D nimmt man hingegen die Seite der Cube Map.
Unter .Net geht es so. Da kann man bei glTexImage2D direkt den Dateinamen angeben, aber es sollte auch leicht übertragbar sein. Wie es mit der textures.pas geht, weiß ich nicht.
Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast
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.