Ich habe ein Problem beim Texturieren von Sonne Erde und Mond, die jeweils mit gluSphere gezeichnet werden. Bei der Sonne und der Erde werden die Texturen korrekt angezeigt, aber wenn die Texturen des Mondes und der Erde dazukommen bricht die Performance extrem (4fps) ein und die Textur des Mondes wird gar nicht dargestellt. Die Texturen werden bei Programmstart mit glBitmap geladen. Bei den Texturen handelt es sich um .tga Files der Größe 1000*500 pixel.
Kann es vielleicht daran liegen, dass die Texturen einfach zu groß sind und beim Vergeben der uv-Koordinaten auf den Spheres der Rechenaufwand einfach zu groß ist? Das mit Sonne, Erde, Mond stammt übrigens aus den Tutorial von Phobeus Danke für den Anreiz
Die Texturen müssen als Höhe/Breite eine Potenz von 2 haben. Passe deine Textur mal auf 1024x512 an. Demit sollte es dann gehen. Und die Größe ist schon recht anständig aber ich denke das ist alles noch halb so wild.
Jo nur gehts. Danke! Aber die Textur für den Mond seh ich immernoch nich. Kann es sein, dass die Textur für den kleinen Popelmond einfach zu groß is und ich deswegen nichts seh?
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Hmmm. Also eigentlich sieht das soweit okay aus. Du machst ja bei dem Mond nichts anders als wie bei der Erde. Und gluSphere benutzt automatisch die gesammte Größe der Textur. Von daher sollte das so gehen.
Prüfe mal an verschiedenen Stellen (Nach dem Initialisieren, Nach dem Rendern) ob du Fehler bekommen hat. Das geht mit dem Aufruf von glGetError. Wenn ja dann schaue mal ob du das evtl noch etwas näher eingrenzen kannst.
Du solltest im übrigen deine mit gluNewQuadric erstellten quadrics auch wieder frei geben. Sonst hast du ein Speicherloch. Und eigentlich sollte ein quadric auch reichen.
PS: Stehen deine Texturen eigentlich auf dem Kopf? "Normal" sollten sie es.
Nein die stehen glaub ich nicht auf dem Kopf. Das war doch bei dem Loader dass er die Texturen umgekehrt in den Speicher schreibt oder? Also ich hab das nichts verändert. Ich musste nur die Erde einnal um 90° drehen weil die Textur so auf der Seite zu liegen schien. Bei der Gelegenheit: Kannst du mir auch noch erklären wie das mit den glDeleteTextures funktioniert. Das hatte ich unten auskommentiert, weil es irgendwie nich ging. PS: Ich hab oeben nochmal den neuen code gepostet. Nach dem Initialisieren und nach dem Rendern liefert glGetError keine Meldung.
Ich hab da noch eine Sache entdeckt. Wenn ich versuchshalber mal die Texturen vom Mond weglasse und ihm einfach nur eine Farbe gebe (ich hab Magenta genommen) dann wird nicht nur der Mond bunt, sondern auch Sonne und Erde inklusive der Textur darauf.
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Auf der Seite liegen. Hmmm. Finde ich irgendwie seltsam. Na ja. Lässt sich ja alles drehen. Und ja ich lade die Texturen anders als alle anderen. Weil ich es nicht einsehe, dass sie auf dem Kopf stehen müssen vor allem, wenn einige Funktionen von OpenGL Texturen so verlangen wie ich sie habe.
Bei glDeleteTextures übergibst du eine Anzahl und einen Pointer auf die die TextureID und schon ist sie gelöscht. Du kannst sowohl bei GenTexture als auch bei DeleteTextures mehrere Namen erstellen oder freigeben lassen. Das sind normal Arrays oder besser gesagt ein Pointer auf das erste Element. Aber wenn man nur eine hat, dann kann man auch direkt einen Pointer auf eine Variable übergeben.
Code:
glDeleteTextures(1,@TexMond);
PS: Ich persönlich empfehle eigentlich eher die Benutzung der Klasse TglBitmap2D die in der glBitmap.pas enthalten ist. Weil die Möglichkeiten die man mit der Funktion hat entsprechen in etwa 5% dessen was man mit der Klasse an Möglichkeiten hat. Wenn es ausreicht. Okay. Aber so würde sich die Klasse komplett um die Verwaltung kümmern und hätte mehr Einstellungsmöglichkeiten.
Zu dem Mond. Ich habe keine Ahnung woran das liegen könnte. Ich bin derzeit auf Arbeit. Da kann ich nicht aber wenn ich heute abend zu hause bin, dann schaue ich mir das mal in ruhe an. Ich denke dann sollte sich das auch klären lassen.
Bunt: Du musst vor dem Zeichnen der Sonne natürlich dort die normale Farbe wieder setzen. OpenGL merkt sich das über die Framegrenzen hinweg. Aber was du mit Bunt beim Mond meinst verstehe ich nicht.
Ok Problem gelöst. Es lag an der Mondtextur. Die .tga Datei schien wohl irgendwie beschädigt. Ich habs mal mit ner anderen MondTextur im Jpeg Format versucht und dann ging es.
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Konntest du die Textur in Grafikprogrammen laden? Falls ja könntest du mir die evtl mal per Mail zuschicken? Meine Adresse findest du auf der Teamseite. Da ich TGAs vollständig per Hand lade versuche ich die natürlich bestmöglich zu unterstützen.
Hier mal nen kleines Foto vom Ergebnis. PS.: Ich hab den Quelltext oben nochmal geändert.
Würd mich freuen wenn ihr vielleicht mal nen kleines Statement dazu abgeben könntet.
Habt ihr ne Idee wie man z.B ne Atmosphäre um die Erde Rendern kann?
Registriert: Mo Jan 31, 2005 11:02 Beiträge: 432 Wohnort: Rheinlandpfalz
Sieht schon ganz hübsch aus, nur die Universum-textur sieht etwas verwaschen aus.
Für die Atmosphäre könntest du noch eine etwas größere Kugel um die Erde zeichnen mit
Wolkentextur und Additivem oder Alpha Blending. Die Textur sollte sich dann natürlich auch bewegen, das kannst
du dann ganz bequem per TextureMatrix machen. (einfach in den TextureMatrix Modus wechseln und dann die Textur translaten)
Gruß,
Matreno
Ich hab leider keine bessere Textur für die Sky Sphere bekommen. Weiss jemand von euch wo man etwas höher aufgelöstes bekommt oder wie man das allgemein besser hinbekommt?
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Habe mir die Textur einmal angesehen und ich weiß was das "Problem" dabei ist. Diese Textur ist ein Graustufenbild. Das bedeutet, dass das Bild nur einen einzigen Kanal mitbringt. Wärend aber bei dem JPEG 3 Kanäle vorhanden sind. Die aber alle 3 das Gleiche beinhalten. (Wobei JPEG auch Graustufen kann.) In jedem Falle ist eine Textur mit nur einem Kanal auch wesentlich Speicherschonender. Bei der Größe der Texturen nicht unbedingt von Nachteil.
Die glBitmap nimmt bei einen Kanal diesen immer als Alpha. Das hat dafür gesorgt, dass du keine Farbe hattest obwohl das Bild richtig geladen wurde. Mit der Methode LoadTextures kannst du darauf keinen Einfluss nehmen. Objekt orientiert sähe der entsprechende Code wie folgt aus.
Code:
Tex := TglBitmap2D.Create;
Tex.LoadFromFile('moonmap.tga');
Tex.InternalFormat:= ifLuminance;// Das ist wichtig. Dort wird ein anderes Format gesetzt.
Tex.GenTexture;
Wenn du gerne mit IDs arbeitest benötigst du noch dieses Stück.
Code:
MoonID := Tex.ID;
Tex.DeleteTextureOnFree:=False;// Verhindert, dass die Texture gelöscht wird
Tex.Free;
Die ist dann genau wie die Methode LoadTextures. Nur, dass für die eine spezielle Textur das Format geändert wird.
Mitglieder in diesem Forum: 0 Mitglieder und 15 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.