Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Kann es sein, dass deine Textur bereits erstellt wurde? Also durch GenTextures. Denn fGetPixelFunc wird nur dann gesetzt wenn ein DataPointer gesetzt wird. Das passiert, wenn Daten geladen, das Format geändert wurde. Das passiert auch, wenn GenTextures die Textur erstellt hat und dann die Daten aus der Klasse gelöscht werden.
Ansonsten wüsste ich nicht wie es dazukommen könnte, dass fGetPixelFunc nil ist. Was machst du denn sonst noch so mit dem Objekt? Bzw was hat denn dein png für ein Pixelformat?
Kann es sein, dass deine Textur bereits erstellt wurde?
Kann sein, muss aber nicht. Es geht bei keiner von beiden Versionen. (DeleteDataAfterGenTexture ist auf false)
Lossy eX hat geschrieben:
Was machst du denn sonst noch so mit dem Objekt? Bzw was hat denn dein png für ein Pixelformat?
Laden (bei verschiedenen Texturen auf verschiedene Weisen Alphakanäle hinzufügen), Versuchen ein paar Pixel mit GetPixel in ein TBitmap zu kopieren, bei Bedarf GenTexture aufrufen und malen.
Hintergrund: In der Textur sind mehrere Objekte für mein Spiel gespeichert (Kacheln in vielfachen von 16px), und im Editor hab ich Vorschaubilder in nem VirtualTreeview. Momentan speicher ich die Textur in nen Stream und lad das in nem TBitmap - langsam und unelegant und im zweifelsfall werden viel zu viele Pixels kopiert. Also wollte ich nur die benötigten Pixel kopieren...
_________________ 2+2=5 For extremely large values of two
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Also um die Texturdaten in ein TBitmap zu kopieren genügt normal auch die Methode AssignToBitmap aufzurufen (sofern das Define GLB_DELPHI aktiv ist). Dann werden die Daten direkt in die Instanz kopiert.
Mit "Was machst du denn sonst noch so" meinte ich aber, dass ich gern etwas code hätte. Aber ich glaube ich weiß woran es liegt. Die einzige Möglichkeit bei der fGetPixelFunc nil sein kann ist wenn man die Datei mit an den Kostruktor übergibt. Also Create('Blah.bmp'). Dann wird die Textur geladen, fGetPixelFunc gesetzt und nach dem Konstruktor in AfterConstruction wird fGetPixelFunc nil gesetzt. Ergo ist es dann nil. So lange bis sich das Format verändert und ein neuer Datenpointer gesetzt wird. (Alphakanal hinzufügen/entfernen).
Möglichkeit für dich wäre Zeile 6142 zu löschen. fGetPixelFunc := nil innerhalb von TglBitmap2D.AfterConstruction. Oder aber zu erst erstellen und dann mit LoadFromFile die Datei laden.
Also um die Texturdaten in ein TBitmap zu kopieren genügt normal auch die Methode AssignToBitmap aufzurufen (sofern das Define GLB_DELPHI aktiv ist). Dann werden die Daten direkt in die Instanz kopiert.
Dafür müsste ich Delphi verwenden.
Wilson hat geschrieben:
Und zwar verwende ich die glBitmap momentan mit Lazarus unter Windows.
Ich hab einen Teil komplett vergessen gehabt, an dem es wohl liegt: Und zwar passe ich die Texturen wenn das System keine NPOT Texturen unterstützt auf POT an (Aufgrund eines komischen Fehlers hat der das auf meinem System auch gemacht, obwohl mein PC das unterstützt, jetzt nach einem neukompilieren tut ers nicht mehr und GetPixel funktioniert auch). Hier ist jedenfalls der Code:
Code:
procedure ResizeToPot(var glBitmap:TGlBitmap2d; out usedFractionX,usedFractionY:Single);overload;
var
newBMP:TglBitmap2d;
srcpixel,dstPixel:PByte;
y:Integer;
Size:Integer;
begin
//Check if needed
ifnot(GL_ARB_texture_non_power_of_two or GL_VERSION_2_0)then
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Wilson hat geschrieben:
Lossy eX hat geschrieben:
Also um die Texturdaten in ein TBitmap zu kopieren genügt normal auch die Methode AssignToBitmap aufzurufen (sofern das Define GLB_DELPHI aktiv ist). Dann werden die Daten direkt in die Instanz kopiert.
Dafür müsste ich Delphi verwenden.
Wilson hat geschrieben:
Und zwar verwende ich die glBitmap momentan mit Lazarus unter Windows.
Ups. Das muss wohl an mir irgendwie vorbei gegangen sein. Damit fällt das wohl ein bisschen flach. Die TBitmaps von Lazarus werde gar nicht unterstützt. Ob ich das tun werde weiß ich allerdings noch nicht.
Und bei deinem Code ist das vom Prinzip das Gleiche wie bei Create an dem ein Dateinamen übergeben wird. Im Konstruktor wird das Bild erstellt und im AfterConstruction wird fGetPixelFunc wieder gelöscht. Es sei denn das Bild hat keinen AlphaKanal dann wird der durch AddAlphaFromValue erstellt und nach dem Konstruktor wird fGetPixelFunc wieder gesetzt. Wenn die aber schon einen hat passiert da nix.
Musst du vorerst so machen wie ich das gesagt habe bis ich das angepasst habe. Und danke.
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Hallo. Danke für den Hinweis. Wobei ich das wohl genau andersrum machen würde. Also weiterhin Bytes benutzen und bei dem Konstantenarray dann die Raute entfernen. So ist es ja eigentlich von anfang an geplannt gewesen. Werde das irgendwann mal fixen.
Jens01 hat geschrieben:
Die LibPNG, die Du empfiehlst, funktionierte nicht. D2009 hatte aber eine eigene Unit für PNGs.
Dazu kann ich nix sagen, da das letzte Delphi womit ich privat gearbeitet habe war Turbo Delphi. Und zum Kompilieren/Testen hatte ich nur mal eine Testversion. Was die PNG Unit in Delphi angeht. Die Unit pngimage wird von der glBitmap.pas immernoch unterstützt. Nur leider gibt es die nicht mehr, da CodeGear (mal wieder) nichts besseres zu tun hatte als sie zu kaufen und vom Markt zu nehmen. Das war auch einer der Gründe warum ich überhaupt die Unterstützung für die libPNG ins Leben gerufen habe.
Registriert: Di Apr 29, 2008 18:56 Beiträge: 1213
Programmiersprache: Delphi/FPC
Heyho,
hab grad nen kleinen Bug entdeckt: beim Speichern von TGA's fliegt mir mein Programm um die Ohren. Grund dafür ist folgende Methode: TglBitmap.SaveTGA.ConvertData. Da wird von 0 bis Width*Height gezählt, das ist aber ein Pixel zu viel
Mal gucken, ob Lossy noch antwortet. Laut seiner Internetseite hat er sich von der Programmierung abgewendet. Ich schätze, wenn wir die Projekte aktuell halten wollen, müssen wir das zukünftig selbst machen.
Registriert: Di Apr 29, 2008 18:56 Beiträge: 1213
Programmiersprache: Delphi/FPC
Jo, hab ich schon fast befürchtet. In der glBitmap gibts es hier und da noch paar Sachen die ich gern anders machen würde... Ma sehen, wenn ich ma Zeit finde nehm ich das vlt mal in Angriff
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Jens01 hat geschrieben:
Mal gucken, ob Lossy noch antwortet. Laut seiner Internetseite hat er sich von der Programmierung abgewendet.
Jain. Ich programmiere noch. Allerdings weder Delphi noch OpenGL sondern nur Dinge die ich persönlich gebrauchen kann. Und das Ganze dann auch noch in C#.
Jens01 hat geschrieben:
Ich schätze, wenn wir die Projekte aktuell halten wollen, müssen wir das zukünftig selbst machen.
Da hast du wohl nicht ganz unrecht. Wobei die glBitmap gerade für OpenGL 3.0+ nie wirklich richtig fit war. Aber von meiner Seite aus spricht auch nichts dagegen, wenn das jemand weiterführen möchte. Sofern der Verweis auf den originalen Urheber und die Quellen nicht entfernt wird. Also frei nach dem Motto "basierend auf glbitmap von blah blah". Bei allem Anderen bin ich flexibel.
Registriert: Do Sep 25, 2003 15:56 Beiträge: 7804 Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Hmmm... also Bugfixings wie dem TGA Problem stehst du ja dann positiv gegenüber. Jetzt würde es Sinn machen die Unit irgendwo immer korrigiert bereit zu stellen. Ich könnte mir vorstellen das im Wiki zu "hosten". Einfacher Grund: Es gibt eine Versionsgeschichte, Es gibt eine einfache diff möglichkeit frei Haus, es ist eigentlich nur ein Textfile und es gibt bereits einen Artikel: Glbitmap_loader Wenn also jemand einen Fix machen will, besorgt er sich den aktuellsten Stand aus dem Wiki, fixt das und lädt die neue Version mit Kommentar (gern auch im Header des Files) wieder hoch.
_________________ Blog: kevin-fleischer.de und fbaingermany.com
Mitglieder in diesem Forum: 0 Mitglieder und 19 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.