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

Aktuelle Zeit: Di Mai 14, 2024 15:08

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 45 Beiträge ]  Gehe zu Seite 1, 2, 3  Nächste
Autor Nachricht
BeitragVerfasst: Mo Mai 21, 2012 18:00 
Offline
DGL Member

Registriert: Di Dez 13, 2011 19:14
Beiträge: 166
Wohnort: Hamburg / Mölln
Programmiersprache: D
Ich lade derzeit per SDL ein Bild und übergebe die Pixel an eine OpenGL Textur.
Beim anzeigen dieser scheint es aber beinahe so, als seien die Farben umgekehrt. Somit bekomme ich statt dem erhofften Resultat (http://s14.directupload.net/file/d/2897 ... 29_png.htm), dies: http://s14.directupload.net/file/d/2897 ... et_png.htm
Das schwarze kann ich mir ja noch durch mangelnden Alpha Kanal, sprich fehlender Transparenz erklären und ließe sich vllt. durch ein Colorkeying abwenden, aber die Farbumkehrung, das aus Rot Blau wird...
Gibt es dafür eine Erklärung? Muss ich evtl. noch irgendwas beachten?

Sorry für die zwei gleichzeitig laufende Threads. :oops:


Zuletzt geändert von rswhite am Di Mai 22, 2012 08:16, insgesamt 3-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Textur: Farben umgekehrt?
BeitragVerfasst: Mo Mai 21, 2012 18:16 
Offline
DGL Member
Benutzeravatar

Registriert: Di Sep 06, 2005 18:34
Beiträge: 362
Wohnort: Hamburg
Hi,

das sieht mir sehr danach aus, dass der Rot und Blau Kanal vertauscht sind.
Versuche mal in deiner Lademethode bei glTexImage2D das Format von GL_RGB zu GL_BGR ändern (mit Alpha wenn du das benutzt).
Siehe auch http://wiki.delphigl.com/index.php/SDL_sample_texture

_________________
Der Mensch hat neben dem Trieb der Fortpflanzung und dem zu essen und zu trinken zwei Leidenschaften: Krach zu machen und nicht zuzuhören. (Kurt Tucholsky)
Schwabbeldiwapp, hier kommt die Grütze. (Der Quästor)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Textur: Farben umgekehrt?
BeitragVerfasst: Mo Mai 21, 2012 18:39 
Offline
DGL Member

Registriert: Di Dez 13, 2011 19:14
Beiträge: 166
Wohnort: Hamburg / Mölln
Programmiersprache: D
Genial, das hatte ich schon wieder längst vergessen. Vielen Dank.
Noch eine Idee vllt., wie man das schwarze weg bekommt, ohne Color-Keying in SDL anzuwenden?

Color-Keying bringt leider gar nichts...
Hier mal wie es jetzt ausschaut: http://s14.directupload.net/file/d/2897 ... pg_png.htm


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Textur: Farben umgekehrt?
BeitragVerfasst: Mo Mai 21, 2012 19:57 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Transparenz hat nur Auswirkungen wenn du auch Blending aktivierst.
http://wiki.delphigl.com/index.php/Tutorial_Lektion_7

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Textur: Farben umgekehrt?
BeitragVerfasst: Mo Mai 21, 2012 21:08 
Offline
DGL Member

Registriert: Di Dez 13, 2011 19:14
Beiträge: 166
Wohnort: Hamburg / Mölln
Programmiersprache: D
Nun, das ist eigentlich aktiviert und arbeitet bei anderen Texturen perfekt.

edit:
Hab mich wohl geirrt. Irgendwie funktioniert das nicht, wenn die Grundfarbe die Transparent sein soll, schwarz ist... Mal gucken, ob ich das beheben kann

edit2:
Ok ich hab nun wirklich alle Kombinationen von glBlendFunc durch, aber das scheint nicht die Lösung zu sein. Ich hab' gelesen, dass, wenn ich einen bestimmten Farbwert Transparent haben möchte, ich dann erstmal meine gesamten Pixel durchsteppen muss und beim auffinden der Farbe dessen Alpha Wert auf Transparent setzen soll.
Aber wie mache ich das wenn ich nur ein SDL Pixel Pointer habe? Oder gibt es noch eine elegantere Methode als so etwas? Ich hab' leider keine gefunden.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Textur: Farben umgekehrt?
BeitragVerfasst: Di Mai 22, 2012 09:20 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
rswhite hat geschrieben:
Nun, das ist eigentlich aktiviert und arbeitet bei anderen Texturen perfekt.

edit:
Hab mich wohl geirrt. Irgendwie funktioniert das nicht, wenn die Grundfarbe die Transparent sein soll, schwarz ist... Mal gucken, ob ich das beheben kann

edit2:
Ok ich hab nun wirklich alle Kombinationen von glBlendFunc durch, aber das scheint nicht die Lösung zu sein. Ich hab' gelesen, dass, wenn ich einen bestimmten Farbwert Transparent haben möchte, ich dann erstmal meine gesamten Pixel durchsteppen muss und beim auffinden der Farbe dessen Alpha Wert auf Transparent setzen soll.
Aber wie mache ich das wenn ich nur ein SDL Pixel Pointer habe? Oder gibt es noch eine elegantere Methode als so etwas? Ich hab' leider keine gefunden.


Warum arbeitest du nicht mit Alpha Masken? Oder 32 bit TGA/PNG Texturen?
Du könntest natürlich auch von Hand beim laden der Texture, mal schnell deine Colorkey farbe durch einen Transparenz wert 0 ändern im Speicher und dann erst hochladen. Bei den heutigen Rechnern, geht das immernoch recht flott.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Mai 22, 2012 09:38 
Offline
DGL Member

Registriert: Di Dez 13, 2011 19:14
Beiträge: 166
Wohnort: Hamburg / Mölln
Programmiersprache: D
Ich erstelle mir meine TileMap und speichere dann nur die Tiles, die ich auch benötige, in einem neuen, kleineren Tileset ab. Dies erstelle ich nach wie vor mit 32 Bit und per SDL. Danach übertrage ich die Pixeldaten dieses neuen Tilesets an eine OpenGL Textur die sie dann fort an hält. Und da habe ich leider keine Ahnung, wie ich die Transparenz hinbekomme, per SDL_SetColorKey geht es schon einmal nicht.

Zitat:
Du könntest natürlich auch von Hand beim laden der Texture, mal schnell deine Colorkey farbe durch einen Transparenz wert 0 ändern im Speicher und dann erst hochladen. Bei den heutigen Rechnern, geht das immernoch recht flott.

Wie genau meinst du das? Mit einer for Schleife durch meine void* Pixel Daten steppen und immer wenn ich auf eine solche Farbe treffe, diese ändern? Wenn ja, weiß ich leider den Ansatz nicht, wie bekomme ich aus einem void* RGB(A) Daten? Und inwiefern würde ich meine
Zitat:
Colorkey farbe durch einen Transparenz wert 0 ändern im Speicher
?
Danke schon mal für die Antworten.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Mai 22, 2012 17:01 
Offline
DGL Member

Registriert: Di Dez 13, 2011 19:14
Beiträge: 166
Wohnort: Hamburg / Mölln
Programmiersprache: D
Ich hab' mir jetzt mal eine Methode geschrieben, die einen Farbwert entgegen nimmt, sowie einen Alpha Wert und alle Farben die mit dieser übereinstimmen werden durch eine neue ersetzt, die die RGB Werte der alten Farbe, aber den alpha Wert, den man auch an die Methode übergeben hat.
Hier mal als Code, falls ich zu wirr rede:
Code:
  1.  
  2. void CreateMaskFromColor(const Color col, ubyte alpha) {
  3.     const Color new_col = col.Modify(Color.Spectrum.Alpha, alpha);
  4.    
  5.     ubyte[4][] color_data;
  6.  
  7.     foreach (const Color pixel_col; this._colors) {
  8.         /*
  9.         if (pixel_col != col) {
  10.             color_data ~= pixel_col.Export();
  11.         } else {
  12.             //pixel_col = new_col;
  13.             color_data ~= new_col.Export();
  14.         }
  15.         */
  16.         color_data ~= pixel_col.Export();
  17.     }
  18.  
  19.     this.LoadFromPixels(color_data.ptr, this._width, this._height, this._deepth, this._format);
  20. }
  21.  


Die "Export" Methode des Color Objekts gibt einfach nur ein ubyte[4] zurück, das aus den RGBA Werten (also [r, g, b, alpha]) besteht.
"this._colors" stammt aus der "LoadFromPixels" Methode. Dort gehe ich die entgegen genommenen Pixel durch und verarbeite sie zu einem Color Objekt. Das scheint auch soweit ganz ordentlich zu funktionieren, aber sicherheitshalber hier nochmal der Abschnitt dafür:

Code:
  1.  
  2. void LoadFromPixels(void* pixels, ushort width, ushort height, ubyte deepth, const Format fmt = Format.None) {
  3.     assert(width >= 2 && height >= 2);
  4.  
  5.     if (pixels !is null) {
  6.         const ubyte* col_pixels = cast(ubyte*)(pixels);
  7.         //writefln("R: %d, G: %d, B: %d, A: %d", pixels[0], pixels[1], pixels[2], pixels[3]);
  8.  
  9.         this._colors.clear();
  10.        
  11.         const uint len = (width * height) / 4;
  12.         for (uint i = 0; i < len; ++i) {
  13.             ubyte[4] col;
  14.  
  15.             for (ubyte j = 0; j < 4; ++j) {
  16.                 col[j] = col_pixels[i + j];
  17.             }
  18.  
  19.             this._colors ~= new Color(col);
  20.         }
  21.     }
  22.  


Leider klappte das nicht, wie ihr ja an dem auskommentierten Part in "CreateMaskFromColor" seht. Es kam nur Pixel Müll raus. Also dachte ich mir erstmal, das ganze mit den originalen Farbwerten (in this._colors) zu testen, die ja eig. das gleiche Bild herbeiführen sollten.
Das passiert aber auch nicht, ich bekomme stattdessen den gleichen Pixel Müll: http://s14.directupload.net/file/d/2898 ... js_png.htm
Ich schätze mal ich vergesse evtl. ein Alignment oder so?
Kann mich jemand auf den richtigen Weg schubsen? Oder ist die ganze Idee quatsch?


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Mai 23, 2012 16:08 
Offline
DGL Member

Registriert: Di Dez 13, 2011 19:14
Beiträge: 166
Wohnort: Hamburg / Mölln
Programmiersprache: D
Hm, keiner mehr, der mir vllt. helfen möchte? :/ Sitze da echt etwas auf der langen Leitung.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Mai 23, 2012 17:26 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
Kann mich jemand auf den richtigen Weg schubsen?

Hm, bei col_pixels[i + j] musst du i mit 4 multiplizieren. Was ist this._colors? So was wie ein dynamisches Array? Es kommt mir merkwürdig vor das du this._colors benutzt bevor es in LoadFromPixels mit Daten gefüllt wird.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Mai 23, 2012 17:29 
Offline
DGL Member

Registriert: Di Dez 13, 2011 19:14
Beiträge: 166
Wohnort: Hamburg / Mölln
Programmiersprache: D
Ok das probiere ich direkt mal.
Ich lade erst die Farben in "LoadFromPixels" und benutze sie dann erst in "CreateMaskFromColor". Aber du hast recht, ich sollte eine Abfrage machen die garantiert, dass überhaupt schon eine Textur geladen wurde.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Mai 23, 2012 17:32 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
Ich lade erst die Farben in "LoadFromPixels" und benutze sie dann erst in "CreateMaskFromColor".

Warum ruft dann CreateMaskFromColor die methode LoadFromPixels auf?

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Mai 23, 2012 17:38 
Offline
DGL Member

Registriert: Di Dez 13, 2011 19:14
Beiträge: 166
Wohnort: Hamburg / Mölln
Programmiersprache: D
Weil ich doch, nach erfolgreicher Änderung der Farbdaten, das Bild neu erstellen muss, damit die Transparenz in die Textur fließt, oder nicht?

edit:
Gut, danke dir für den Tipp, nun kann ich das Bild anhand meiner Pixeldaten schon einmal selber neu erstellen, d.h. ich lese die Pixel korrekt.
Nun versuche ich mal das schwarz transparent zu bekommen.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Mai 23, 2012 17:49 
Offline
DGL Member

Registriert: Di Dez 13, 2011 19:14
Beiträge: 166
Wohnort: Hamburg / Mölln
Programmiersprache: D
Gut, das scheint leider nicht zu klappen.
Ich hab mir mal mit "CHANGE" eine Ausgabe dazu gepackt, damit ich sehe, ob etwas geändert wird.
Code:
  1.  
  2. foreach (const Color pixel_col; this._colors) {
  3.     if (pixel_col != col) {
  4.         color_data ~= pixel_col.Export();
  5.     } else {
  6.         //pixel_col = new_col;
  7.         color_data ~= new_col.Export();
  8.         writeln("CHANGE");
  9.     }
  10.    
  11.     //color_data ~= pixel_col.Export();
  12. }
  13.  

Das passiert aber nicht, wenn ich
Code:
  1.  
  2. this._tex.CreateMaskFromColor(Color.Black, 0); // Color.Black = Color(0, 0, 0, 255)
  3.  

mache, sondern nur, wenn ich folgendes anstelle:
Code:
  1.  
  2. this._tex.CreateMaskFromColor(Color.Black.Modify(Color.Spectrum.Alpha, 0), 255);
  3.  


"Color.Black.Modify(Color.Spectrum.Alpha, 0)" ändert Color.Black und gibt eine Kopie davon mit geänderten alpha Wert (hier 0) zurück.
Nun wird mir auch "CHANGE" ausgegeben. Aber ob ich nun 255 oder 0 als Alpha übergebe, das Bild bleibt bei diesem: http://s14.directupload.net/file/d/2897 ... pg_png.htm


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Mai 23, 2012 17:55 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Ok, das lag an meinem Mangel an Verständnis der Sprache D ;)

Es dürfte sowieso deutlich effizienter sein das Array direkt in-place zu modifizieren, ca. so:
Code:
  1. void CreateMaskFromColor(const Color col, ubyte alpha) {
  2.     const Color new_col = col.Modify(Color.Spectrum.Alpha, alpha);
  3.     foreach (Color pixel_col; this._colors) {
  4.         if (pixel_col == col) {
  5.             pixel_col = new_col;
  6.         }
  7.     }
  8. }



Ich fürchte du musst mehr Quellcode zeigen. Wie wird die Textur an OpenGL übergeben und wie wird gerendert?

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 45 Beiträge ]  Gehe zu Seite 1, 2, 3  Nächste
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 9 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.027s | 19 Queries | GZIP : On ]