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);
Ä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
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 ?
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my 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
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.
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 network • my 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
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
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 network • my 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
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
_________________ 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
@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
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.