Registriert: Di Dez 13, 2011 19:14 Beiträge: 166 Wohnort: Hamburg / Mölln
Programmiersprache: D
Das wird dort auch in Place modifizert, aber die Farbe die ich an "CreateMaskFromColor" übergebe war ja vorher ein einfaches schwarz mit RGBA von 0, 0, 0, 255. Dann wollte ich mal 0, 0, 0, 0 probieren, und das ist scheinbar auch das schwarz im Bild, was ich als Transparenz haben will, denn bei dieser Farbe bekomme ich ja eine Zutreffungs Meldung mit "CHANGE".
Hier mal meine ganze "CreateMaskFromColor" und "LoadFromPixels" Methoden; "Export" gibt die Farbe als ubyte[4] (im Range von 0 - 255) als RGBA Format und "GLConvert" gibt die Farbe als float[4] (im Range von 0 - 1) als RGBA Format zurück.
Code:
void CreateMaskFromColor(const Color col,ubyte alpha){
const Color new_col = col.Modify(Color.Spectrum.Alpha, alpha);
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Ich hab den Link auf nen pad entfernt und statt dessen das Highlighting in deinem Beitrag repariert. Mit [code=d] gibts Highlighting für D .
// edit: glEnable(GL_BLENDING) hast du aber ausprobiert und auch beim Rendern gesetzt mit entsprechender blendfunc?
grüße
_________________ 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
Also wenn da D nicht irgendwelche total unerwartete Magic macht erstellst du ein zweites Array in das du die Texturdaten kopierst. Dann wird das Original-Array geleert und die Daten werden zurück kopiert. Über die Ineffizienz von dynamisch wachsenden Arrays will ich gar nicht erst anfangen. Aber gut Effizienz ist zunächst irrelevant....erst mal den Code zum laufen kriegen
Ist den "deepth" auch 32? Anderenfalls wird glTexImage2D das ganze nämlich als RGB behandeln, nicht als RGBA. Am Ende muss da für als internes Format GL_RGBA8 (sollte äquivalent zum alten "4" sein) und als externes Format GL_RGBA rauskommen. Ich frage deshalb weil dein Ursprungsbild ja gerade keinen Alphakanal hat, weshalb du die ganze Aktion hier durchziehst
Blend ist/war bisher nicht aktiviert, aber ich hab mal probeweise (mit den vorherigen Code) den BlendMode auf BlendMode.Alpha gestellt, aber passieren tut da leider trotzdem nichts. Was mich viel mehr irritiert ist, dass das schwarz ja eig. schon RGBA mäßig 0, 0, 0, 0 ist und damit ja eig. transparent sein sollte, oder?
Ja, mit dem Array und dem kopieren würde ich gerne nochmal genauer hören, das könnte ein Performance Problem sein.
auch wirklich das gewünschte? Fügt ~= in D nur ein Element hinzu oder jedes Element des Arrays?
Das Rendern sieht für mich ok aus, jedenfalls springt mir nix ins Auge.
Zitat:
Was mich viel mehr irritiert ist, dass das schwarz ja eig. schon RGBA mäßig 0, 0, 0, 0 ist und damit ja eig. transparent sein sollte, oder?
Richtig.
Zitat:
Ja, mit dem Array und dem kopieren würde ich gerne nochmal genauer hören, das könnte ein Performance Problem sein.
Das mit dem zweimal kopieren sollte klar sein. Dadurch das du das zweite Array anlegst brauchst du doppelt soviel Speicher, des weiteren sind Hauptspeicher-Allokationen immer relativ langsam.
Nun zum dynamischen Array: Nun die üblichen CPUs und Speichercontroller können nur feste Speicherbereiche allokieren. Es ist normalerweise nicht möglich einen bereits allokierten Speicherbereich nachträglich zu vergrößern. Den im Bereich dahinter könnte ja ein Speicherbereich liegen der bereits anderweitig benutzt wird. Die einzige Möglichkeit ist also einen neuen, größeren Speicherbereich zu allokieren und die Daten zu kopieren. Natürlich kann man einfach von vorne herein einfach genug Speicher allokieren...aber wieviel? Woher soll die Anwendung wissen ob du 10 oder 100000 Elemente in deinem Array haben willst? Entweder du musst ständig das Array vergrößern oder du verschwendest massiv Speicher. Das übliche Vorgehen ist mit einer kleinen Größe (z.B. 10) anzufangen. Reicht die aktuelle Größe des Arrays nicht mehr wird das Array um einen Faktor (irgendwas zwischen 1.5 und 2) vergrößert. Du hast dann also 20, 40, 80 Elemente usw. So ist der Prozentsatz der Speicherverschwendung nicht so groß. Trotzdem, bei jeder Vergrößerung muss der komplette Array-Inhalt kopiert werden. Daher: Sofern die nötige Größe leicht berechnet werden kann so wie hier (Höhe*Breite*Pixelgröße) direkt die Größe festlegen. Dann muss nur ein einziges mal Speicher allokiert werden. Eine vernünftige Implementierung sollte dir dafür entsprechende Funktionen bieten. Etwa der std::vector von C++ (auch sowas wie ein dynamisches Array) bietet die Funktion reserve und resize für diesen Zweck.
Registriert: Di Dez 13, 2011 19:14 Beiträge: 166 Wohnort: Hamburg / Mölln
Programmiersprache: D
Da das D ist, sind Arrays hier identisch mit std::vector aus C++, um Speicher muss man sich hier also gar keine Gedanken machen.
Code:
~=
Fügt ein Element zu einem Array hinzu, ist das hinzuzufügende Element aber auch wiederum ein Array, werden alle Elemente des Arrays nacheinander hinzugefügt.
Da wir uns bei der Transparenz von Schwarz einig sind, würde es etwas bringen, mein originales Tileset und das, was ich mir selbst anlege (ich lege es selbst an, da man für gewöhnlich ja nur einen Bruchteil des Originalen Tilesets benötigt und man somit keine riesen Texturen in den Speicher laden muss) euch zu zeigen? Vllt. wisst ihr ja, wieso die Transparenz nicht wirkt.
Hast du eigentlich mal geprüft wie viele Pixel so grob schwarz sind? Wenn du z.B. deine Bilder JPG komprimierst könnte es ja sein das deine Pixel zum großen Teil die Farbe (1,1,1) haben statt (0,0,0). JPG ist eben verlustbehaftet und die beiden Farben sind für das Auge quasi nicht zu unterscheiden was sie zu idealen Kandidaten zur Kompression macht.
Registriert: Di Dez 13, 2011 19:14 Beiträge: 166 Wohnort: Hamburg / Mölln
Programmiersprache: D
Es sind beides .png Dateien, also eig. sollte da kein Verlust entstehen. Das Original Tileset ist dieses hier: http://s14.directupload.net/file/d/2899 ... wu_png.htm Das von mir erstellte konnte ich da nicht hochladen und bekam diese Fehlermeldung:
Zitat:
Ups... da ist was schief gelaufen ...
Der Dateityp wurde überprüft und entspricht nicht den vorgegeben Standardtypen.
Es wäre schön, wenn du es nochmal mit einer anderen Datei probierst
Bitte beachten: Wir akzeptieren ausschließlich JPG, JPEG, PNG, GIF und SWF Dateien.
Scheinbar ist da irgendwas schief gelaufen beim erstellen. o.O
Er macht zwar aus Rot, Blau, aber bei bspw. Weiß arbeitet er korrekt, also wird es an dem Format von BGRA liegen. D.h. soweit ich das verstehe, dass mir nun eig. nur noch die passende glBlendFunc fehlt, damit das wirkt. Oder liege ich da falsch? Wenn nicht, könnt ihr mir helfen? Meinen bisherigen Ansatz seht ihr da oben in der Render Funktion. Bisher nutze ich, wie gesagt, BlendMode.Alpha. Habe aber auch schon alle anderen durch probiert. Oder brauche ich evtl. glAlphaFunc? Wenn ja, wie wende ich sie hierbei an?
Danke bis hierhin, ihr habt mir schon immens weitergeholfen.
Nimm mal dieses Zeug mit glBlendFuncSeparate raus. Das ist irgendeine Ur-Alt-Extension, vielleicht macht die Probleme.
glAlphaFunc setzt die Blend-Funktion für den Alpha-Kanal, legt also fest was in den Alpha-Kanal des Framebuffers geschrieben wird. Das kann dir aber reichlich egal sein, da du ja nur den Source-Alpha-Kanal (GL_SRC_ALPHA) benötigst, nicht GL_DEST_ALPHA.
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Coolcat hat geschrieben:
glAlphaFunc setzt die Blend-Funktion für den Alpha-Kanal, legt also fest was in den Alpha-Kanal des Framebuffers geschrieben wird. Das kann dir aber reichlich egal sein, da du ja nur den Source-Alpha-Kanal (GL_SRC_ALPHA) benötigst, nicht GL_DEST_ALPHA.
Sorry nein. glAlphaFunc ist für den Alpha-Test. Der blendet Fragmente aus, die den Test nicht bestehen.
grüße
_________________ 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
Registriert: Di Dez 13, 2011 19:14 Beiträge: 166 Wohnort: Hamburg / Mölln
Programmiersprache: D
Also ist glAlphaFunc die Lösung? Werde es gleich mal probieren. Hoffe ihr seid noch nicht so genervt von mir. ^^
edit: Irgendwie verzweifle ich gerade: ich muss die alphaFunc doch dann direkt vor dem eigentlichen Rendern Aufrufen oder nicht? Sprich in dieser Methode der TileMap:
Hab auch schon alle flags dort ausprobiert. Einmal mit ref von 0 und einmal mit 1. Bin ich dort falsch oder verwende ich sie nicht richtig oder muss ich sie _mit_ Blending benutzen?
edit2: Ok, aktivieren sollte man es vorher schon... Dennoch bleibt die Frage: muss ich es _mit_ Blending machen? Weil bisher ist mein Bild entweder wie bisher oder komplett weiß. -.-
Alpha-Test hat nichts/wenig mit Alpha-Blending zu tun. Vergiss glAlphaFunc bitte für den Augenblick mal gerade.
Allerdings bringt mich das auf eine Idee: Kann es sein das du deine Szene in der falschen Reihenfolge renderst? Wann immer du Alpha-Blending machst wird die Reihenfolge richtig. Immer von hinten nach vorne rendern. Also den Hintergrund zuerst und dann deine Objekte drüber.
Registriert: Di Dez 13, 2011 19:14 Beiträge: 166 Wohnort: Hamburg / Mölln
Programmiersprache: D
Ich wüsste nicht, wie ich anderes Rendern sollte. Ich Rendere ja nur die Daten die ich den Buffer übertragen habe. Wenn ich sie "reversed" in den Buffer übertrage, bekomme ich dieses Bild, sprich der Untergrund überlagert die Layer weiter oben: http://s14.directupload.net/file/d/2900 ... 5z_png.htm
So langsam weiß ich echt nicht mehr weiter. -.-
edit: ich schätze fast mal, dass ich irgendwie die übertragenen Tiles, die ich mit der SDL ausschneide, nicht richtig transparent übernehme. Aber auch da wüsste ich nicht, wie sonst.
Ich poste einfach mal, aus reiner Verzweiflung, den Code. Einmal die Load und Draw Funktion der TileMap:
Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast
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.