Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 04, 2025 19:15

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 10 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: "Feedback" & Frage zum TGA-Lader
BeitragVerfasst: So Okt 19, 2008 09:53 
Offline
DGL Member

Registriert: Sa Okt 18, 2008 11:59
Beiträge: 180
Also ich hab seit kurzem angefangen mich mit den Tutorials zu DelphiGL zu befassen und muss sagen, dass ich sie recht gut sind, da sie gut beschrieben und durch die "Witze" nicht so trocken sind. Macht weiter so. ;)

Aber wer ist LEKTOR (der mit den vielen Anmerkungen^^)?

Was ich allerdings nicht so gut fand war die Beschreibung für "glRotatef", ich hab sie mehrmals durchgelesen und nicht kapiert, erst ein rumspielen sorgte für ein aufgehendes Glühbirnchen.


Mein eigentliches ist allerdings das laden von TGA-Bildern, das Tutorial hat mich an der Stelle zu stark verwirrt.
Kann mir einer helfen? Ich weiß absolut nicht wie ich die Bilder nun laden soll und was ich laut Tutorial nun deklarieren und implementieren soll.
(http://wiki.delphigl.com/index.php/Tutorial_Lektion_4#Tapeten_besorgen)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Okt 19, 2008 10:53 
Offline
DGL Member
Benutzeravatar

Registriert: Do Aug 25, 2005 16:00
Beiträge: 189
Programmiersprache: Java, C#
Ich nehm ganz einfach mal an das du SDL benutzt um Bilder zu laden (wie im Tutorial vorgeschlagen). Wenn du SDL_Image eingebunden hast (oben in den uses drin stehen) dann brauchst du um das Bild in den Speicher zu laden (dann ist es aber noch keine Textur) ein PSDL_Surface. Im Tutorial hat Phobeus es tex genanne. Das ist die erste Variable die du deklarieren musst.

Dieser Variable weist du mit dem Befehl IMG_Load("Pfad zum Bild') "die Werte zu", das Bild wird also in den Speicher geladen und du kannst mit der Variable tex darauf zugreifen. Im nächsten Schritt überprüft er mit assigned ob das mit dem Laden auch so funktioniert hat wie es soll, also ob im Speicher die Daten sind oder nicht (gleichwertig wäre die Abfrage tex <> nil).

Wenn man die Daten im Speicher hat kann man dazu übergehen aus diesen Daten eine OpenGL-Textur zu erstellen. Dazu braucht man eine weitere Variable vom Typ Cardinal. Dann musst du die Textur erstellen (mit dem Befehl glGenTextures(). Der erste Parameter ist die Anzahl an zu erstellenden Texturen, in deinem Fall 1. Der zweite Parameter ist ein Zeiger auf eine Textur-ID. Diese Textur-ID ist deine weiter oben erstellte Cardinal-Variable) Joa, und ab jetzt gibts nicht viel mehr zu erzählen als im Tutorial drin steht. Der nächste Schritt ist die Textur zu binden (mit glBindTexture(GL_TEXTURE_2D, TexID), wobei der zweite Parameter wieder die Cardinal-Variable ist, die du oben erstellt hast - diesmal allerdings nicht als Zeiger). Dann die beiden glTexParameteri aus dem Tutorial setzen. Dann können die Daten aus dem Arbeitsspeicher (deiner tex-Variable) zu einer OpenGL-Textur verarbeitet werden, mithilfe des Befehls glTexImage2D (den hat Phobeus ja ausführlich beschrieben).

Tja, und dann hat man die Daten halt immer noch im Arbeitsspeicher. Diese Daten braucht man aber nicht mehr, also kann man die Daten löschen. Und das funktioniert mit dem Befehl SDL_FreeSurface(). Der Parameter ist dabei ein PSDL_Surface, deine tex-Variable von ganz am Anfang.


Noch mal in Kurzform: Deklarieren musst du 2 Variablen, ein PSDL_Surface mit dessen Hilfe du die Daten in den Arbeitsspeicher lädst und das du nach der eigentlichen Erstellung deiner Textur nicht mehr brauchst und eine Cardinal-Variable, die die Textur-ID enthalten wird mit der du später auf die Textur zugreifen kannst, sie binden, löschen, usw.


Zuletzt geändert von Deathball am So Okt 19, 2008 10:54, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Okt 19, 2008 10:54 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Das laden von TGA Bildern wie es da im Tutorial verlinkt ist, kann dir eigentlich egal sein. Du kannst das Tutorial einfach so weiter machen, der dortige Link ist nur eine alternative.

Lektor: Das ist derjenige, der das Tutorial vor dem Erscheinen nochmal gelesen und geprüft hat (irgendwer, der Latein gelernt hat/lernt könnte hier jetzt mal die Herleitung aus dem lateinischen bringen ;) ).

Gruß Lord Horazont

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Okt 19, 2008 16:42 
Offline
DGL Member

Registriert: Sa Okt 18, 2008 11:59
Beiträge: 180
Danke war sehr hilfreich. =)

Aber irgendwo stand das TGA das empfehlenswerteste Format sei, wegen Transparenz und schnellem platzieren, da es einfach aufgebaut ist.
Aber mit welchem Programm kann ich TGA-Bilder erstellen? Und wo bekomm ist es her?
Da ich noch in die Schule gehe (12. Klasse) fehlt es mir auch an Geld, weshalb es ein kostenloses Programm sein muss.
(Oder sollte ich für die neue Frage auch ein neues Thema erstellen? :P)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Okt 19, 2008 16:50 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 16, 2008 20:26
Beiträge: 158
Wohnort: Berlin
Programmiersprache: c++,c#,java,ruby,php
Heutzutage gibt es das meiste in irgendeiner Form auch kostenlos und oh wunder genau das was du suchst auch =)
http://www.gimp.org/
Ist eigentlich recht gut, am anfang vll etwas gewöhnungsbedürftig, dafür kann man damit fast alles machen.
Sollte genug Totorials oder Wikis dazu geben, die dir da weiterhelfen, falls du nicht weiterkommen solltest.
mfg ^^

_________________
System: Phenom XII X4 955 3,21Ghz , GTX 560 TI, 4GB-Ram, Windows 7 64x


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Okt 20, 2008 17:26 
Offline
DGL Member

Registriert: Sa Okt 18, 2008 11:59
Beiträge: 180
Hiho, ich bins wieder. (Bitte nicht genervt sein ;) )

Es geht um dasselbe Tutorial nochmals...

Hab ein von mir verwendetes Beispielbild (BMP-Format) Problemlos reinbekommen.

Hab das Tutorial weitergelesen und bin zu diesem Fließband gekommen.
(Bild)
Ich hab die Grafik (GIF-Format) heruntergeladen und wollte sie laden... und schon bekam ich Adresse Fehler in der Funktion "glTexImage2D();", eine Umwandlung in TGA oder BMP (was bei meiner eigenen Testgrafik funktionierte) brachte ebenfals nur Fehler in den Adressen... welche Parameter müsste ich verwenden und wie kann ich ein andauerndes umstellen der Parameter verhindern (oder: "Wie kann ich es machen das OpenGL oder SDL automatisch die Parameter einstellt?")?

Ich verstehe nicht wieso mein eigenes BMP-Testbild funktionierte, aber dieses umgewandelte Bild nicht...
(Übrigens: mit JPG hat das ganze wiederrum geklappt, aber ich will nicht immer alle Formate austesten müssen.)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Okt 21, 2008 08:42 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Wenn du ein Bild lädst, dann musst du dich leider vergewissern, dass dieses Bild auch ein passendes Format. Im Falle des von dir verlinkten Bildes ist es so, dass dieses Bild eine Farbtabelle enthält. Innerhalb der Bilddaten steht nur noch ein Index auf einen der maximal 256 Werte der Farbtabelle. Die Farbtabelle enthält dann bis zu 256 RGB Werte. GIFs können von Hause aus ausschließlich nur Formate mit Farbtabellen abspeichern. BMP, TGA und PNG können auch Bilder mit Farbtabellen. Und JPEGs können gar keine Farbtabellen. Wenn du also dieses GIF als BMP, TGA oder PNG speicherst, dann sollte GIMP so schlau sein und die Farbtabelle mit übertragen. Bei JPEG hingegen muss das Bild aber in ein RGB Bild umgewandelt werden. Zum händischen konvertieren in GIMP gehst du auf den Menüpunkt "Bild" -> "Modus" -> "RGB". Dann konvertiert Gimp das Bild in ein RGB Bild.

OpenGL akzeptiert aber nur RGB Bilder. Also ohne Farbtabelle. SDL wiederrum kann aber auch Bilder mit Farbtabelle laden. Wenn du jetzt also ein Bild mit einer Farbtabelle an OpenGL übergibst, dann übergibst du nur die 1 Byte großen Indizes anstelle der 3 oder 4 Byte großen RGB Werte (pro Pixel). Damit ist der Speicher den du übergibst kleiner als das was OpenGL erwartet.

Bei den Bildern kann es im übrigen auch noch passieren, dass die Farben anders angeordnet sind. Also einige Formate haben Rot/Grün/Blau und andere haben Blau/Grün/Rot. Dann kann es sein, dass du zwar ein Bild lädst aber es von den Farben her ziemlich komisch aussieht.

Das Ganze kannst du kompensieren in dem du das geladene Bild in ein passendes Format konvertierst. Wobei ich vor dem Gebrauch von Bilden mit Farbtabelle nur grundsätzlich abraten kann. Besonders in der 3D Programmierung. Mit folgendem Code lade ich ein Bild und konvertiere dieses stumpf ins RGBA Format.
Code:
  1. var
  2.   Surface, ConvSurface: PSDL_Surface;
  3.   Format: TSDL_PixelFormat;
  4. begin
  5.   Surface := IMG_Load(FileName);
  6.  
  7.   if Surface <> nil then
  8.     try
  9.       FillChar(Format, SizeOf(TSDL_PixelFormat), 0);
  10.       Format.BitsPerPixel := 32;
  11.       Format.BytesPerPixel := 4;
  12.       Format.RMask := $000000FF;
  13.       Format.GMask := $0000FF00;
  14.       Format.BMask := $00FF0000;
  15.       Format.AMask := $FF000000;
  16.       Format.Rshift :=  0;
  17.       Format.Gshift :=  8;
  18.       Format.Bshift := 16;
  19.       Format.Ashift := 24;
  20.  
  21.       ConvSurface := SDL_ConvertSurface(Surface, @Format, SDL_SWSURFACE);
  22.       if ConvSurface <> nil then
  23.         try
  24.           // Mach hier was mit dem konvertierten Surface!!
  25.         finally
  26.           SDL_FreeSurface(ConvSurface);
  27.         end;
  28.     finally
  29.       SDL_FreeSurface(Surface);
  30.     end;


Du könntest natürlich noch eine Variante für RGB Bilder einfügen. Allerdings ist es natürlich immer besser das Format zu benutzen in welchem das Bild auch vorliegt. Denn sollte es sich um ein Bild ohne Alphakanal handeln, dann wird so immer ein Alphakanal hinzugefügt und der verbraucht dann ungenutzt Speicher. Bei drei gleich großen Bildern geht so der Speicherplatz für ein Viertes verlohren. Also ist die Menge des Speichers nicht ganz unerheblich. Aus dem Grund benutzt ich der glBitmap auch nahezu immer das Format des Bildes. Allerdings ist das Mapping dadurch nicht gerade klein. Aber ich denke es lohnt sich. Sowohl im benutzt Speicher als auch in der Geschwindigkeit.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Okt 23, 2008 09:47 
Offline
DGL Member

Registriert: Sa Okt 18, 2008 11:59
Beiträge: 180
Angenommen ich will nur TGA-Texturen verwenden, da die von dem Tutorial empfohlen wurden.

Dann gibt es doch eigentlich nur 2 Situationen oder? Einmal MIT und einmal OHNE Alpha-Kanal (Transparenz wenn ich richtig verstanden habe).
Entsprechend brauch ich ja nur 2 Textur-Lade-Routinen (es lebe der Neologismus).

Seh ich das richtig? Und wenn ja wie müssten diese heißen?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Okt 23, 2008 13:45 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Also 2 Laderoutinen brauchst du normal gar nicht. Es würde schon ausreichen, wenn du nach dem Laden des Bildes die Parameter des Bildes überprüfst und ein passendes Format auswählst. Das geladene Surface muss auch irgendwie ein Record vom Typ TSDL_PixelFormat, oder einen Pointer darauf, besitzen. In diesem steht halt wie die Bilddaten beschaffen sind. Die kannst du auswählen und dann passend dazu eine OpenGL Konstante wählen.

Wenn du nur RGB bzw RGBA unterstützten möchtest, dann vereinfacht das alles etwas. Wobei TGA neben diesen Formaten auch noch Graustufen, Graustufen mit Alpha und Bilder mit Farbtabelle unterstützt. Aber ich meine bei Graustufen ist SDL so "klever" und wandelt diese automatisch in RGB um. Bilder mit Farbtabelle sind für uns Unwichtig und Graustufen werden zwar durchaus benutzt aber man kann auch ohne Leben.

Ich muss da aber gestehen, dass ich nicht genau weiß wie SDL die Bilder lädt. Normal liegen die Pixel in einem TGA in BGR Format vor. Es kann aber sein, dass SDL dies bereits automatisch nach RGB konvertiert. Bei "RGB mit Alpha" sollte das BitsPerPixel des Records auf 32 stehen. Da könntest du als Format für glTexImage dann GL_BGRA oder GL_RGBA benutzen. Musst du mal schauen was von den Farben her hinhaut. Bei "RGB ohne Alpha" sollte das Feld auf 24 stehen. Das ist als Format GL_BGR bzw GL_RGB.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Okt 23, 2008 14:07 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
SDL konvertiert nicht automatisch.

Ansonsten würde ich sagen, dass du erstmal einen fertigen Loader wie glBitmap oder easySDLTextures verwendest.
Den die Details bei den Texturen sind erstmal unwichtig. Und ansonsten auch nur für den Augenblick wenn man einen Loader selber schreibt.

_________________
Steppity,steppity,step,step,step! :twisted:
❆ ❄ ❄ ❄ ❅ ❄ ❆ ❄ ❅ ❄ ❅ ❄ ❅ ❄ ❄
❄ ❄ ❄ ❅ ❄ ❄ ❄ ❅ ❄ ❄ ❆ ❄ ❄


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 10 Beiträge ] 
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 5 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.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.013s | 17 Queries | GZIP : On ]