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

Aktuelle Zeit: Di Jul 15, 2025 21:02

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



Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Autor Nachricht
BeitragVerfasst: So Mär 23, 2008 22:31 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Feb 13, 2006 19:32
Beiträge: 20
Hallo,

ich habe das alphamasking-Tutorial durchgemacht und wollte es um ein paar weitere Texturen erweitern (im Codeschnippsel unten wäre es nur eine: die 'tree2', Zeile 16) . Allerdings gibt's da ein Problem, das ich überhaupt nicht verstehe: Wenn ich das Array vergrößere, das meine Texturen aufnehmen soll, wird die jeweils letzte Textur in der Prozedur Load.Textures nicht geladen.
Wenn die Skybox-Texturen vor den Objekttexturen geladen werden (wie im Codeschnippsel unten), dann betrifft es die letzte Textur im Array ObjectTextures, wird der Block für die Skybox dagegen nach dem Laden der Texturen für ObjectTextures ausgeführt, trifft es die letzte Textur im SkyBoxTexture - Array. Es hängt also nicht damit zusammen, dass die Texturdateien nicht zu finden wären oder deren Format nicht stimmen würde (sind alle 256x256). Ich hab' jetzt x-mal die Indizes der Arrays gecheckt, verändert, dynamische, statische Arrays ausprobiert und komm' einfach nicht drauf, was da schief läuft. Hat jemand 'ne Idee?

Viele Grüsse,
Ö

Code:
  1.  
  2. (* Im Kopf des Hauptprogramms wird die Größe des Arrays
  3. festgelegt, das die Objekttexturen aufnehmen soll *)
  4. const
  5.  NumTex    = 3;
  6. (* ... *)
  7. var
  8.   ObjectTexture   : Array[0..NumTex-1] of TGLBmp;
  9.   SkyBoxTexture : Array[0..5] of TGLBmp;
  10. (* ... *)
  11. // =======================================
  12. // Loads all needed textures
  13. // =======================================
  14. procedure TGLForm.LoadTextures;
  15. const
  16.  Name       : array[0..NumTex-1] of String = ('grass1', 'tree', 'tree2');
  17.  SkyBoxName : array[0..5] of String = ('BK', 'FR', 'DN', 'UP', 'LF', 'RT');
  18. var
  19.  i : Integer;
  20. begin
  21. // Now we load the images and generate our textures
  22.   for i := 0 to High(SkyBoxTexture) do begin
  23.    SkyBoxTexture[i] := TGLBmp.Create;
  24.    if not SkyBoxTexture[i].LoadImage(SkyBoxName[i]+'.jpg') then
  25.      ShowMessage('Couldn''t load Skybox texture ' + inttostr(i));
  26.    // We need to clamp our textures so that our borders look right
  27.    SkyBoxTexture[i].SetTextureWrap(GL_CLAMP_TO_EDGE, GL_CLAMP_TO_EDGE);
  28.    SkyBoxTexture[i].GenTexture(False, False);
  29.   end;
  30.   GenerateSkyBox(64, 64, 64);
  31.   for i := 0 to High(Name) do begin
  32.    ObjectTexture[i] := TGLBmp.Create;
  33.    if not ObjectTexture[i].LoadImage('tex'+ Name[i]+ '.jpg') then
  34.       ShowMessage('Couldn''t load Object texture ' + inttostr(i));
  35.    if Name[i] <> 'grass1' then
  36.     if not ObjectTexture[i].AddAlpha('tex'+ Name[i]+ 'alpha.jpg') then
  37.       ShowMessage('Couldn''t load Alphamask ' + inttostr(i));
  38.    ObjectTexture[i].GenTexture(False,False);
  39.   end;
  40. end;


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Mär 25, 2008 14:08 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Feb 13, 2006 19:32
Beiträge: 20
Hallo Leute,

ich arbeite immer noch an dem oben beschriebenen Problem herum. Hab' die Alphamasking-Funktionalität aus dem Tutorial-Beispiel inzwischen in ein eigenes Projekt übernommen, mit dem ich zuvor beliebig viele Texturen laden konnte.
Mit Alphamasking ging das zunächst auch noch gut, bis ich die Anzahl der zu Ladeden Texturen auf 6 erhöht habe.
Jetzt tritt der Fehler wieder auf. Debuggen ergibt, dass der Fehler sich daraus ergibt, weil die Funktion GetDIBits in der unit glBmp an der folgenden Stelle beim Laden der letzten Textur den Wert "false" zurück gibt:

Code:
  1.  
  2. // Get the image data from the bitmap into our memory buffer
  3.   res := GetDIBits(BMP.Canvas.Handle, BMP.handle, 0, Height, rgbBits, TBitmapInfo(iHeader^), DIB_RGB_COLORS);
  4.   if (res = 0) then begin
  5.     Result := False;
  6.     JPG.Free;
  7.     BMP.Free;
  8.     Exit;
  9.   end;
  10.  


Da für jedes jpg auch ein alphamask-jpg geladen wird, handelt es sich um insgesamt 12 Aufrufe der Methode Textures.LoadImage (Zeile 33 im Codeauszug meines ersten Beitrags). In meinem Projekt sind alle diese Texturdateien jpegs im Format 256 x 256.

... fällt dazu jemandem etwas ein ? ... wär' super ...
... ist zu erwarten, dass der Fehler nicht auftritt, wenn ich auf SDL umstiege?

Viele Grüsse,
ö


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Mär 25, 2008 14:15 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
ölgötz hat geschrieben:
... ist zu erwarten, dass der Fehler nicht auftritt, wenn ich auf SDK umstiege?


Du redest von SDL? Nein, defintiv musst du da mit dem Fehler nicht rechnen, da du dort überhaupt nciht auf Windowsfunktionen zurückgreifst und dementsprechend auch keine Bitmaps sondern Surfaces hast. Du kannst dennoch so ziehmlich jedes gängige Bildformat ohne probleme Laden (abgesehen von DDS).

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: Di Mär 25, 2008 14:36 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Feb 13, 2006 19:32
Beiträge: 20
Hallo Lord Horazont,

genau. SDL meinte ich. Hab's nach meinem letzten Posting vor ein paar Minuten selbst ausprobiert. Der Umstieg war total easy, die 3 units aus meinem alten Projekt lassen sich ohne Probleme auch im SDL-template verwenden. Ich hatte mir das wesentlich komplizierter vorgestellt ... bin begeistert !

Gruss,
Ö


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Problem bleibt bestehen
BeitragVerfasst: Mo Mär 31, 2008 09:38 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Feb 13, 2006 19:32
Beiträge: 20
Hallo,

ein paar Tage später und viele Codezeilen weiter musste ich feststellen, dass das Problem durch Verwendung der SDL immer noch nicht gelöst ist. Da meine Texturen aus einer unit geladen werden, die immer noch die unit glBmp benutzte, tritt der Fehler auch hier wieder auf ... nur halt noch ein paar Texturen später. Ich hab' jetzt mal mein altes Projekt näher angeschaut, mit dem ich damals die "unbegrenzte" Anzahl von Texturen erfolgreich laden konnte. Dort wurden die Texturen in ein array aus TglBitmap2D geladen. Und diese Klasse stammt wiederum aus der unit glBitmap.
Das könnte ich natürlich auch wieder so machen, aber das Problem ist, dass ich diesmal auch noch die alphachannel-Funktionalität nutzen will. Und die wird im alphachannel-Tutorium halt unter Benutzung der glBmp mit der Methode
Code:
  1.  
  2. function TGLBMP.AddAlpha(filename : String) : Boolean;
  3.  

erreicht.
Die Klasse TglBitmap2D in der unit glBitmap hat eine Methode, die zumindest dem Namen nach was ähnliches macht. Allerdings hat sie eine völlig andere Parameterliste, mit der ich leider nicht so viel anfangen kann:
Code:
  1.  
  2. function TglBitmap2D.IntAddFuncAlpha(Func: TglBitmapFunction; CreateTemp: Boolean; Data: Pointer): boolean;
  3.  

... kann mir jemand auf die Sprünge helfen, wie ich die Methode gebrauchen kann? Oder gibt es noch andere Möglichkeiten, Alphamasking zu verwenden, ohne die gLBmp zu benutzen?
... es wär' echt super, wenn mir jemand helfen könnte ...

Viele Grüsse,
Ö


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mär 31, 2008 11:44 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Diese Methoden sind eigentlich nur Interne Funktionen. Deswegen sind sie in der Klassedefinition auch als Protected deklariert, weil man darauf von außen auch nicht zugreifen soll.

In der Basisklasse (TglBitmap) sind aber eine Reihe an Methoden implementiert die mit AddAlphaFrom anfangen. Dort stehen unter anderem File, Stream, Bitmap, Resource, ColorKey etc zur Auswahl. Diese stehen selbstverständlich in den abgeleiteten Klassen (TglBitmap2D) auch zur Verfügung.

Wobei ich dir aber empfehlen würde den Alphakanal immer in das Bild zu integrieren, da das nachträgliche Hineinbastelt Zeit kostet die man sich eigentlich sparen kann.


Aber tu bitte dir bitte einen Gefallen und zieh dir die (noch) aktuellste Version von meiner Webseite. Denn die Version, in der die Methode IntAddFuncAlpha noch existiert, ist schon ziemlich veraltet.


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 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.011s | 14 Queries | GZIP : On ]