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

Aktuelle Zeit: Di Jul 15, 2025 18:27

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 15 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Texture-Loader schafft PNGs nicht
BeitragVerfasst: Do Nov 25, 2010 18:30 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Okt 03, 2007 14:22
Beiträge: 388
Hi,

mein Texture-Loader packt es nicht PNGs zu laden. Bin immer gut mit Targa ausgekommen für transparente Angelegenheiten und für Fälle ohne Alphakanal auch gut mit JPEG, aber da ich 1. gerade nicht den Alphakanal in GIMP gebacken bekomme für eine Targa und 2. es sowieso nicht sein kann, dass ich mein Lieblingsformat PNG nicht verwenden kann, hier also die Frage, warum ich beim Laden und anschließendem Rendern einer PNG immer nur weiß sehe. Ich verwende SDLImage, da ich eh SDL benutze für alles mit OpenGL.
Code:
uses
  SDLImage, ...;

// OpenGL-Textur erstellen
function CreateTexture(SDL_Surface : PSDL_Surface) : Integer;
var tmpInitial : PSDL_Surface;
     Texture    : GluInt;
    MaxAni     : Real;
begin
  // Es ist nicht klar, ob die Funktion erfolgreich durchläuft.
  Result := -1;
  if Assigned(SDL_Surface) then
  begin
    // Für Alphakanal
    tmpInitial := SDL_DisplayFormatAlpha(SDL_Surface);
    SDL_FreeSurface(SDL_Surface);
    // Da der Alphakanal die Farben vertauscht, muss dies über SwapRGB gerade gebogen werden.
    SwapBGR(tmpInitial);

    glGenTextures(1, @Texture);
    glBindTexture(GL_TEXTURE_2D, Texture);
    // Die Größen werden automatisch berechnet. Sonst wären nur Potenzen von 2 möglich (16x16, 32x32, usw.).
    if tmpInitial.format.BytesPerPixel > 3 then
      glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, tmpInitial^.w, tmpInitial^.h, 0, GL_RGBA, GL_UNSIGNED_BYTE, tmpInitial^.pixels)
    else
      glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, tmpInitial^.w, tmpInitial^.h, 0, GL_RGB, GL_UNSIGNED_BYTE, tmpInitial^.pixels);
    // Textureigenschaften setzen
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR_MIPMAP_LINEAR);
    if IsExtensionSupported('GL_EXT_texture_filter_anisotropic') then
    begin
      glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, @MaxAni);
      glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, MaxAni/2);
    end;
    glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);
    glGenerateMipmap(GL_TEXTURE_2D);
    // Mipmaps generieren
    if tmpInitial.format.BytesPerPixel > 3 then
      gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA, tmpInitial^.w, tmpInitial^.h, GL_RGBA, GL_UNSIGNED_BYTE, tmpInitial^.pixels)
    else
      gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB, tmpInitial^.w, tmpInitial^.h, GL_RGB, GL_UNSIGNED_BYTE, tmpInitial^.pixels);
    // Freigabe
    SDL_FreeSurface(tmpInitial);
    // Rückgabe
    Result := Texture;
  end;
end;

// Textur aus Datei laden und mit definierten Index in Texturarray schreiben
function LoadTexture(Filename : String; aId : Integer) : Boolean;
begin
  Result := False;
  if FileExists(Filename) then
  begin
    SetLength(Tex, High(Tex)+2);
    with Tex[High(Tex)] do
    begin
      Id     := Succ(aId);
      Textur := CreateTexture(IMG_Load(PChar(Filename)));
    end;
    Result := True;
  end;
end;

// Farben vertauschen
procedure SwapBGR(SDLSurface : PSDL_Surface);
var x, y           : Integer;
    p              : UInt32;
    pR, pG, pB, pA : PUInt8;
    r, g, b, a     : UInt8;
begin
  for y := 0 to Pred(SDLSurface.h) do
    for x := 0 to Pred(SDLSurface.w) do
    begin
      p := SDL_GetPixel(SDLSurface, x, y);

      pR := @r;
      pG := @g;
      pB := @b;
      pA := @a;

      SDL_GetRGBA(p, SDLSurface.format, pR, pG, pB, pA);
      p := SDL_MapRGBA(SDLSurface.format, b, g, r, a);

      SDL_PutPixel(SDLSurface, x, y, p);
    end;
end;


Gruß,
Nils

_________________
Meine Musik: spiker-music.net


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Nov 25, 2010 18:42 
Offline
DGL Member
Benutzeravatar

Registriert: Di Sep 20, 2005 13:18
Beiträge: 1054
Wohnort: Dresden
Programmiersprache: C, C++, Pascal, OPL
Äh, du nutzt ja SDL, da müsste PNG eigentlich gehen. Ist die nötige DLL (libpng oder so) im Ordner?
Ansonsten hier mal mein Code, um eine beliebige Textur mit Alphawert (auch PNGs) zu laden:
Code:
function LoadTexture(name : String) : GLuint;
var surface : PSDL_Surface;
    texture : GLuint;
begin
  surface:=IMG_Load(@name[1]);
  glGenTextures(1,@texture);
  glBindTexture(GL_TEXTURE_2D,texture);
  glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
  glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_LINEAR); 
  gluBuild2DMipmaps(GL_TEXTURE_2D,4,surface^.w,surface^.h,GL_RGBA,GL_UNSIGNED_BYTE,surface^.pixels);
  SDL_FreeSurface(surface);
  exit(texture);
end;

_________________
Denn wer nur schweigt, weil er Konflikte scheut, der macht Sachen, die er hinterher bereut.
Und das ist verkehrt, denn es ist nicht so schwer, jeden Tag zu tun als ob's der letzte wär’.
Und du schaust mich an und fragst ob ich das kann.
Und ich denk, ich werd' mich ändern irgendwann.

_________________Farin Urlaub - Bewegungslos


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Nov 25, 2010 18:50 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Okt 03, 2007 14:22
Beiträge: 388
Hm, die DLL hab ich nicht im Ordner. Welche genau müsste das denn sein ? Die offizielle libpng bringt nichts. Bei Deinem Code gibt es bei gluBuild2DMipmaps eine Zugriffsverletzung - vielleicht eben gerade weil da eine Bibliothek fehlt, aber ich höre auch gerade zum ersten Mal, dass man da noch was zusätzlich braucht.

Edit: Treffer bei SDL_image selbst, im Binary-Paket ist die gesuchte Bibliothek dabei. Nun wird die Datei auch geladen, allerdings ist die Transparenz halt sehr grob, kann man da noch irgendetwas machen ?

_________________
Meine Musik: spiker-music.net


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Nov 25, 2010 19:02 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Die Transparenz wird an der Datei liegen. Die wird genauso interpoliert wie der normale Farbkanal.
Anmerkung zu Ziz' Code:
Zitat:
gluBuild2DMipMaps
Never use this. Use either GL_GENERATE_MIPMAP or the glGenerateMipmap function.

http://www.opengl.org/wiki/Common_Mistakes#gluBuild2DMipmaps

greetings

_________________
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  
BeitragVerfasst: Do Nov 25, 2010 19:06 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Okt 03, 2007 14:22
Beiträge: 388
Hm, nur wenn eine kleine Linie zu einer dicken aufgeblasen wird, nur weil die Ränder der Linie halbtransparent sind, dann ist das schon eine miese Qualität, gibt es irgendetwas was man beim Abspeichern der Dateien falsch machen kann ? In Grafikprogrammen sieht die Transparenz einwandfrei aus.

_________________
Meine Musik: spiker-music.net


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Nov 25, 2010 19:08 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Lad mal die PNG hier hoch bitte.

greetings

_________________
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  
BeitragVerfasst: Do Nov 25, 2010 19:25 
Offline
DGL Member
Benutzeravatar

Registriert: Di Sep 20, 2005 13:18
Beiträge: 1054
Wohnort: Dresden
Programmiersprache: C, C++, Pascal, OPL
Lord Horazont hat geschrieben:
Die Transparenz wird an der Datei liegen. Die wird genauso interpoliert wie der normale Farbkanal.
Anmerkung zu Ziz' Code:
Zitat:
gluBuild2DMipMaps
Never use this. Use either GL_GENERATE_MIPMAP or the glGenerateMipmap function.

http://www.opengl.org/wiki/Common_Mistakes#gluBuild2DMipmaps
greetings

GL_GENERATE_MIPMAP ist erst ab OpenGL 1.4 vorhanden und glGenerateMipmap sogar erst ab 3.0 (!). Mit
gluBuild2DMipMaps bin ich abwärtskompatibel.

_________________
Denn wer nur schweigt, weil er Konflikte scheut, der macht Sachen, die er hinterher bereut.
Und das ist verkehrt, denn es ist nicht so schwer, jeden Tag zu tun als ob's der letzte wär’.
Und du schaust mich an und fragst ob ich das kann.
Und ich denk, ich werd' mich ändern irgendwann.

_________________Farin Urlaub - Bewegungslos


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Nov 25, 2010 19:32 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Okt 03, 2007 14:22
Beiträge: 388
Im Anhang ist sie. Abwärtskompatibilität ist mir persönlich auch recht wichtig, würde die glu-Funktion auch nicht freiwillig eintauschen jetzt.


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

_________________
Meine Musik: spiker-music.net


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Nov 25, 2010 19:57 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Also dünn ist die Linie jetzt nicht gerade. Wie sieht es denn im Kontrast dazu im Programm aus?

greetings

_________________
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  
BeitragVerfasst: Do Nov 25, 2010 20:10 
Offline
DGL Member
Benutzeravatar

Registriert: Di Sep 20, 2005 13:18
Beiträge: 1054
Wohnort: Dresden
Programmiersprache: C, C++, Pascal, OPL
Habe den Fehler gefunden. Er lag bei mir. Ich habe meine Funktion mal angepasst:
Code:
function LoadTexture(name : String) : GLuint;
var surface : PSDL_Surface;
    texture : GLuint;
    buffer  : pchar;
begin
  surface:=IMG_Load(@name[1]);
  if surface=nil then
  begin
    buffer:= SDL_GetError;
    writeln(buffer);
  end;
  glGenTextures(1,@texture);
  glBindTexture(GL_TEXTURE_2D,texture);
  glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
  glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_LINEAR); 
  gluBuild2DMipmaps(GL_TEXTURE_2D,4,surface^.w,surface^.h,GL_RGBA,GL_UNSIGNED_BYTE,surface^.pixels);
  SDL_FreeSurface(surface);
  exit(texture);
end;

Da kam dann der Fehler:
"Couldn't open ./feld.pngexture.png"
D.h. der hat keine Null ans Ende gepackt. Und warum nicht? Man muss (bei FreePascal) {$H+} an den Anfang der Datei hauen, damit er automatisch nullterminierende Strings erzeugt. Allternativ kann man die Null natürlich auch selbst ranhauen mit loadtexture('dateiname.png'+chr(0)).
So sieht es dann aus:
Dateianhang:
bild.jpg


Aber ein Problem könnte es noch geben: Grafikkarten mögen keine Texturen, deren Seitenlänge keine Zweiterpotenzen (2,4,8,16,32,64,128,256, usw.) sind. Wobei ich nicht weiß, ob gluBuildMipMaps das korrigiert.

LG Ziz


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

_________________
Denn wer nur schweigt, weil er Konflikte scheut, der macht Sachen, die er hinterher bereut.
Und das ist verkehrt, denn es ist nicht so schwer, jeden Tag zu tun als ob's der letzte wär’.
Und du schaust mich an und fragst ob ich das kann.
Und ich denk, ich werd' mich ändern irgendwann.

_________________Farin Urlaub - Bewegungslos


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Nov 25, 2010 20:12 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Okt 03, 2007 14:22
Beiträge: 388
Hm, hätte ich selbst drauf kommen können, dass ich den Screenshot der Textur aus dem Programm gleich mit hochlade....


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

_________________
Meine Musik: spiker-music.net


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Nov 25, 2010 20:27 
Offline
DGL Member
Benutzeravatar

Registriert: Di Sep 20, 2005 13:18
Beiträge: 1054
Wohnort: Dresden
Programmiersprache: C, C++, Pascal, OPL
Meine magischen Kräfte sagen: Da ist Blending nicht aktiviert, nur Alphatest.
Mach mal:
Code:
  glEnable(GL_BLEND);
  glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);

_________________
Denn wer nur schweigt, weil er Konflikte scheut, der macht Sachen, die er hinterher bereut.
Und das ist verkehrt, denn es ist nicht so schwer, jeden Tag zu tun als ob's der letzte wär’.
Und du schaust mich an und fragst ob ich das kann.
Und ich denk, ich werd' mich ändern irgendwann.

_________________Farin Urlaub - Bewegungslos


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Nov 25, 2010 20:36 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Okt 03, 2007 14:22
Beiträge: 388
Ohje... Vielen Dank, jetzt läuft es.

_________________
Meine Musik: spiker-music.net


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Nov 26, 2010 01:50 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
@Ziz:
Du solltest den String einfach zu PChar konvertieren mit PChar('Pfad zur Texture') und dann passt es mit den C-String. Ist der saubere Weg.

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


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Nov 26, 2010 09:25 
Offline
DGL Member
Benutzeravatar

Registriert: Di Sep 20, 2005 13:18
Beiträge: 1054
Wohnort: Dresden
Programmiersprache: C, C++, Pascal, OPL
i0n0s hat geschrieben:
@Ziz:
Du solltest den String einfach zu PChar konvertieren mit PChar('Pfad zur Texture') und dann passt es mit den C-String. Ist der saubere Weg.

Ich denke, dass ein Setzen eines Flags auch sauber ist. Zudem ich mir da das Konvertieren spare. ;-)

_________________
Denn wer nur schweigt, weil er Konflikte scheut, der macht Sachen, die er hinterher bereut.
Und das ist verkehrt, denn es ist nicht so schwer, jeden Tag zu tun als ob's der letzte wär’.
Und du schaust mich an und fragst ob ich das kann.
Und ich denk, ich werd' mich ändern irgendwann.

_________________Farin Urlaub - Bewegungslos


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


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:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.009s | 14 Queries | GZIP : On ]