Ich habe vor kurzem eine Cubemap erzeugt und diese auf eine Kugel gelegt. Das läuft auch einwandfrei. Dies tat ich damals mit Hilfe von mehreren Files. Nun bin ich umgestiegen auf Streams und habe die Cubemaps über Streams gebunden. Das läuft auch alles wunderbar, nur habe ich festgestellt, dass jedesmal wenn ich meinen Stream for dem GenerateCubeMap freigebe alles funktioniert. Tue ich das jedoch anschliessend, ist mein Bildschirm schön weiss. Ich wollte den Stream ursprünglich mit einem Clear leeren, jedoch funktioniert das nicht. Kann sich irgendwer von Euch dieses komische verhalten erklären? aCubeArray beinhaltet die 6 Texturen und CubeMapOptions die Positionen an der die CubeMap erzeugt werden sollen.
Der funktionierende Source Code sieht so aus:
Code:
FCubeMap := TGLBitmapCubeMap.Create; for i:=low(aCubeArray) to high(aCubeArray) do begin ImageStream := TMemoryStream.Create; try aCubeArray[i].SaveToStream(ImageStream); ImageStream.seek(0,sofromBeginning); FCubeMap.LoadFromStream(ImageStream); finally FreeAndNil(ImageStream); end; FCubeMap.GenerateCubeMap(CubeMapOptions[i],true); end;
Der nicht funktionierende mit weissen Texturen sieht so aus:
Code:
FCubeMap := TGLBitmapCubeMap.Create; for i:=low(aCubeArray) to high(aCubeArray) do begin ImageStream := TMemoryStream.Create; try aCubeArray[i].SaveToStream(ImageStream); ImageStream.seek(0,sofromBeginning); FCubeMap.LoadFromStream(ImageStream); FCubeMap.GenerateCubeMap(CubeMapOptions[i],true); finally FreeAndNil(ImageStream); end; end;
P.S.: In beiden FCubeMaps befindet sich nach dem LoadFromStream eine Textur.
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Ich habe keine Ahnung warum es da einen Unterschied gibt. Normal gibt es dabei nämlich keinen. Und die Reihenfolge ist in dem Fall so was von egal. Eine Delphi Exception gab es ja vermutlich nicht, oder? FCubeMap.LoadFromStream ließt Daten von einem Stream in interne Strukturen. FCubeMap.GenerateCubeMap übergibt die internen Strukturen an OpenGL. Macht genau das gleiche wie GenTexture von TglBitmap2D.
Das Einzige was mir da einfallen würde wären beide Durchgänge mal laufen zu lassen und die 2x6 Texturen mit der glBitmap als Datei (BMP, TGA oder DDS) abspeichern. So ablegen, dass du unterscheiden kannst welche Datei von was ist. Also den Versuch und CubeMapOptions[i] mit in den Namen einfließen lassen. Anschließend dann die Dateien vergleichen. Wenn die Dateien jeweils identisch sind ist es echt mysteriös. Wenn nicht, dann gibts doch irgendwo einen Unterschied. Damit eine CubeMap weiß wird genügt es meines Wissen nach, wenn eine Textur eine falsche Größe/Format etc hat. Also wenn eine Defekt sieht du gar keine mehr. Meine ich zu mindest. Ist alles schon zu lange her.
Aber was am Rande. Was macht denn "aCubeArray[i].SaveToStream(ImageStream);"? Sieht in meinen Augen etwas unnötig aus. Wenn du in aCubeArray Streams ablegst könntest du das direkt an die glBitmap übergeben. Du müsstest dann die Daten nicht noch mal im Speicher hin und her kopieren. Je nachdem was da in SaveToStream passiert kann es massiv Zeit beanspruchen bzw auch eine Herrausforderung für einen Speichermanager werden. Ideal wäre also LoadFromStream(aCubeArray[i]).
Hallo Lossy, Vielen Dank für die Antwort. Ich werd das mal testen. Naja, ich benutze eine Pixelgraphic und den Stream derer kann ich nur mit SaveToStream erzeugen.
Mitglieder in diesem Forum: 0 Mitglieder und 7 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.