DirectDraw Surface (*.dds) Laden

Für Probleme bezüglich Grafik, Audio, GL, ACS, ...
Antworten
Warf
Beiträge: 1910
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

DirectDraw Surface (*.dds) Laden

Beitrag von Warf »

Hey ho Leute,

ich suche derzeit eine Möglichkeit DirectDraw Surface Texturdateien zu laden. Ich möchte sie lediglich laden und Anzeigen können, ohne DirectX oder OpenGL.
Nun habe ich dafür außer Imaging Lib noch nichts gefunden, und diese Funktioniert scheinbar mit neuere Lazarusversionen nicht (Ich kann nach der Installation keine Grafiken mehr anzeigen lassen).

Kennt ihr vielleicht noch eine Bibliothek zum Laden des DDS Formats, ich bräuchte nur eine Möglichkeit es zu Laden, und als Bitmap wieder zwischenzuspeichern zum Anzeigen. Es würde schon reichen wenn ihr eine Möglichkeit kennen würdet wie ich auf die Pixel Daten zugreife. Nun leider ist das DDS Format recht Komplex, und ich habe mich mit Grafikformaten sowieso noch nicht allzusehr auseinander gesetzt.

Vielleicht kennt wer von euch ja eine gute Bibliothek.

Grüße Fred

Komoluna
Beiträge: 565
Registriert: So 26. Aug 2012, 09:03
OS, Lazarus, FPC: Windows(10), Linux(Arch)
CPU-Target: 64Bit

Re: DirectDraw Surface (*.dds) Laden

Beitrag von Komoluna »

http://wiki.delphigl.com/index.php/Texture_Loader
glBitmap.pas ist zwar für OpenGL, aber da findest du jedenfalls einen Loader für DDS.
Andere Libs, die DDS können fallen mir gerade nicht ein.
(Weiß jemand, ob TPicture das unterstützt???)

MFG

Komoluna
Programmer: A device to convert coffee into software.

Rekursion: siehe Rekursion.

Warf
Beiträge: 1910
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: DirectDraw Surface (*.dds) Laden

Beitrag von Warf »

Damit habe ich es jetzt auch mal probiert:

Code: Alles auswählen

 
procedure glBitmapLoad(Path: string; g: TGraphic);
var
  ms: TMemoryStream;
  ddsData: TglBitmapData;
  tmpBmp: TBitmap;
begin
  tmpBmp := TBitmap.Create;
  try
    ms := TMemoryStream.Create;
    try
      ddsData := TglBitmapData.Create(Path);
      try
        ddsData.SaveToStream(ms, ftBMP);
      finally
        ddsData.Free;
      end;
      ms.Seek(0, soFromBeginning);
      tmpBmp.LoadFromStream(ms, ms.Size);
    finally
      ms.Free;
    end;
    if Assigned(g) then
      g.Assign(tmpBmp);
  finally
    tmpBmp.Free;
  end;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  Image1.Picture.Bitmap := TBitmap.Create;
  if OpenDialog1.Execute then
    glBitmapLoad(OpenDialog1.FileName, Image1.Picture.Graphic);
end;


Bei BMP dateien kein Problem, bei DDS Dateien kommt der Fehler:
unsupportet format: tfs3tcDtx1RGBA

Bei dem Speichern als BMP (SaveToStream). Speichern ins Raw Format funktioniert, das kann TPicture aber auch nicht lesen.

Versuche ich vor dem Speichern die Methode ConvertTo(tfBGR8ub3) // Ein Bitmap Format
kommt der Fehler
compressed formats are not supported tfS3tcDtx1RGBA


Leider kenne ich mich mit Bild Fomaten nicht sehr gut aus, und weiß nicht was ich hier machen soll (noch dazu ist die Unit glBitmap recht schwach dokumentiert).

Grüße
Fred

Bergmann89
Beiträge: 98
Registriert: Di 15. Nov 2011, 11:36

Re: DirectDraw Surface (*.dds) Laden

Beitrag von Bergmann89 »

Hey,

die aktuelle glBitmap ist zum größten Teil auf meinem Mist gewachsen. Wie die Meldungen dir schon sagen:
- Bitmap speichern geht nicht, weil Bitmap das DDS Format nicht unterstützt
- Konvertieren ist der richtige Weg, aber die glBitmap kann die kompremierten Formate nur an OpenGL weitergeben. Eine Bearbeitung (bzw. Konvertierung) der Daten ist deshalb nicht möglich.
Wenn ich mal Zeit hab kann ich mir ja mal ansehen wie die Kompremierung bei DDS gelöst ist und das ConvertTo entsprechend anpassen.

MfG Bergmann.

creed steiger
Beiträge: 957
Registriert: Mo 11. Sep 2006, 22:56

Re: DirectDraw Surface (*.dds) Laden

Beitrag von creed steiger »

http://wiki.freepascal.org/Graphics_libraries


Wenn Vampyre bei dir nicht funzt (evtl mal SVN/Git whatever probieren), könntest du evtl mal bei Code Typhoon gucken da sollte die dabei sein.
Nennt sich halt dann pl_irgendwie.

Sonst mal Castle Game Engine anschauen ob der es hergibt.

Warf
Beiträge: 1910
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: DirectDraw Surface (*.dds) Laden

Beitrag von Warf »

So ich habe jetzt mal versucht, da ich die Graphik nur darstellen will diese per OpenGl Context zu rendern, bin aber auch Dar auf ein kleines Problem gestoßen, wie verwende ich den dglOpenGL header in lazarus? Jedes mal wenn ich damit versuche einen gl Befehl auszuführen (z.b. glEnable) bekomme ich einen Fehler( bin grade am Handy, wenn ich wieder am pc bin schreib ich welchen) .
mit den lazarus headern (gl, glu, Glut units) funktioniert alles wunderbar. Nun ich bin nicht grade ein gl Profi, um ehrlich zu sein, ausser einem Pong habe ich noch nichts groß damit gemacht

Komoluna
Beiträge: 565
Registriert: So 26. Aug 2012, 09:03
OS, Lazarus, FPC: Windows(10), Linux(Arch)
CPU-Target: 64Bit

Re: DirectDraw Surface (*.dds) Laden

Beitrag von Komoluna »

Hast du

Code: Alles auswählen

InitOpenGl;
ReadImplementationProperties;
ReadExtensions;
bei, Programmstart aufgerufen?

Wenn die Lib nicht geladen is wird das auch nix.

MFG

Komoluna
Programmer: A device to convert coffee into software.

Rekursion: siehe Rekursion.

Warf
Beiträge: 1910
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: DirectDraw Surface (*.dds) Laden

Beitrag von Warf »

Danke, habe ReadImplementationProperties; vergessen

Antworten