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

Aktuelle Zeit: Di Jul 15, 2025 11:04

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



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

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:
  1.  
  2. void CreateMaskFromColor(const Color col, ubyte alpha) {
  3.     const Color new_col = col.Modify(Color.Spectrum.Alpha, alpha);
  4.  
  5.     ubyte[] color_data;
  6.  
  7.     foreach (const Color pixel_col; this._colors) {
  8.         if (pixel_col != col) {
  9.             color_data ~= pixel_col.Export();
  10.         } else {
  11.             //pixel_col = new_col;
  12.             color_data ~= new_col.Export();
  13.             writeln("CHANGE");
  14.         }
  15.     }
  16.  
  17.     this.LoadFromPixels(&color_data[0], this._width, this._height, this._deepth, this._format);
  18. }
  19.  
  20. void LoadFromPixels(void* pixels, ushort width, ushort height, ubyte deepth, const Format fmt = Format.None) {
  21.     //assert(pixels !is null); // wegen SubTexture
  22.     assert(width >= 2 && height >= 2);
  23.  
  24.     // Wenn es schon eine Textur gibt...
  25.     if (this._format != Format.None) {
  26.         // Alte löschen...
  27.         this._Delete();
  28.     }
  29.  
  30.     // neu generieren.
  31.     this._Create();
  32.  
  33.     if (pixels !is null) {
  34.         const ubyte* col_pixels = cast(ubyte*)(pixels);
  35.         //writefln("R: %d, G: %d, B: %d, A: %d", pixels[0], pixels[1], pixels[2], pixels[3]);
  36.  
  37.         this._colors.clear();
  38.  
  39.         const uint len = (width * height);
  40.         for (uint i = 0; i < len; ++i) {
  41.             ubyte[4] col;
  42.  
  43.             for (ubyte j = 0; j < 4; ++j) {
  44.                 col[j] = col_pixels[i * 4 + j];
  45.             }
  46.  
  47.             this._colors ~= new Color(col);
  48.         }
  49.     }
  50.  
  51.     Format format;
  52.     if (fmt == Format.None) {
  53.         switch (deepth) {
  54.             case 32:
  55.                 format = Format.RGBA;
  56.             break;
  57.  
  58.             case 24:
  59.                 format = Format.RGB;
  60.             break;
  61.        
  62.             default:
  63.                 debug {
  64.                     writefln("Deepth: %d", deepth);
  65.                 }
  66.  
  67.                 throw new Exception(
  68.                     "warning: the image is not truecolor ...this will probably break"
  69.                 );
  70.         }
  71.     } else {
  72.         format = fmt;
  73.     }
  74.  
  75.     const GLuint previous_texture = this.CurrentlyBound();
  76.  
  77.     this.Bind();
  78.  
  79.     glCheck(glTexImage2D(GL_TEXTURE_2D, 0, deepth / 8, width, height, 0, format, GL_UNSIGNED_BYTE, pixels));
  80.  
  81.     //glCheck(glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, true));
  82.    
  83.     glCheck(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP));
  84.     glCheck(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP));
  85.     glCheck(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, this._smooth ? GL_LINEAR : GL_NEAREST));
  86.     glCheck(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, this._smooth ? GL_LINEAR : GL_NEAREST));
  87.  
  88.     this._format = format;
  89.  
  90.     this._width  = width;
  91.     this._height = height;
  92.     this._deepth = deepth;
  93.  
  94.     this._ReBind(previous_texture);
  95. }
  96.  


Danke für deine Hilfe schonmal. :)


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

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 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: Mi Mai 23, 2012 18:29 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
Das wird dort auch in Place modifizert

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 ;)

_________________
Yeah! :mrgreen:


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

Registriert: Di Dez 13, 2011 19:14
Beiträge: 166
Wohnort: Hamburg / Mölln
Programmiersprache: D
Ah, nette Sache mit dem code Tag, danke. ;)
Deepth ist 32 und Format ist BGRA.
Mein RenderCode (wegen glBlendFunc) sieht folgendermaßen aus:
Code:
  1.  
  2. void Render(const Rect dst, const RenderMode mode = RenderMode.Normal) const {
  3.     const GLuint previous_texture = this.CurrentlyBound();
  4.  
  5.     if (!glIsEnabled(GL_TEXTURE_2D)) {
  6.         glCheck(glEnable(GL_TEXTURE_2D));
  7.     }
  8.  
  9.     float tx = 0.0;
  10.     float ty = 0.0;
  11.     float tw = 1.0;
  12.     float th = 1.0;
  13.    
  14.     if (this.HasViewport()) {
  15.         tx = this._viewport.x / cast(float) this._width;
  16.         ty = this._viewport.y / cast(float) this._height;
  17.  
  18.         tw = tx + (cast(float) this._viewport.Width / this._width);
  19.         th = ty + (cast(float) this._viewport.Height / this._height);
  20.     }
  21.  
  22.     this.Bind();
  23.  
  24.     glCheck(glPushAttrib(/*GL_CURRENT_BIT|*/GL_COLOR_BUFFER_BIT));
  25.  
  26.     // Setup alpha-blending
  27.     if (this._blend_mode == BlendMode.None) {
  28.         glCheck(glDisable(GL_BLEND));
  29.     } else {
  30.         glCheck(glEnable(GL_BLEND));
  31.  
  32.         switch (this._blend_mode) {
  33.             case BlendMode.Alpha:
  34.                 if (DerelictGL.isExtensionSupported("GL_EXT_blend_func_separate")) {
  35.                     glCheck(glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA));
  36.                 } else {
  37.                     glCheck(glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA));
  38.                 }
  39.             break;
  40.  
  41.             case BlendMode.Add:
  42.                 glCheck(glBlendFunc(GL_SRC_ALPHA, GL_ONE));
  43.             break;
  44.  
  45.             case BlendMode.Multiply:
  46.                 glCheck(glBlendFunc(GL_DST_COLOR, GL_ZERO));
  47.             break;
  48.  
  49.             default: break;
  50.         }
  51.     }
  52.  
  53.     final switch (mode) {
  54.         case RenderMode.Normal:
  55.             glBegin(GL_QUADS);
  56.                 glTexCoord2f(tx, ty);           glVertex2f(dst.x, dst.y);
  57.                 glTexCoord2f(tx + tw, ty);      glVertex2f(dst.x + dst.Width, dst.y);
  58.                 glTexCoord2f(tx + tw, ty + th); glVertex2f(dst.x + dst.Width, dst.y + dst.Height);
  59.                 glTexCoord2f(tx, ty + th);      glVertex2f(dst.x, dst.y + dst.Height);
  60.             glEnd();
  61.         break;
  62.  
  63.         case RenderMode.Flip:
  64.             glBegin(GL_QUADS);
  65.                 glTexCoord2f(tx, ty + th);      glVertex2f(dst.x, dst.y);
  66.                 glTexCoord2f(tx + tw, ty + th); glVertex2f(dst.x + dst.Width, dst.y);
  67.                 glTexCoord2f(tx + tw, ty);      glVertex2f(dst.x + dst.Width, dst.y + dst.Height);
  68.                 glTexCoord2f(tx, ty);           glVertex2f(dst.x, dst.y + dst.Height);
  69.             glEnd();
  70.         break;
  71.     }
  72.  
  73.     glPopAttrib();
  74.  
  75.     this._ReBind(previous_texture);
  76. }
  77.  


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. :)


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

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Macht den
Code:
  1. color_data ~= new_col.Export();

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.

_________________
Yeah! :mrgreen:


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

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:
  1. ~=
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.

Bsp.:
Code:
  1.  
  2. import std.stdio;
  3.  
  4. void main() {
  5.     int[] arr;
  6.    
  7.     arr ~= 0;
  8.     arr ~= 1;
  9.     arr ~= [2, 3, 4];
  10.    
  11.     writeln(arr); // [0, 1, 2, 3, 4]
  12. }
  13.  


Zu Export und GLConvert, hier der Code:
Code:
  1.  
  2.     float[4] GLConvert() const pure {
  3.         const float r = this.r <= 1.0 ? this.r : this.r / 255.0;
  4.         const float g = this.g <= 1.0 ? this.g : this.g / 255.0;
  5.         const float b = this.b <= 1.0 ? this.b : this.b / 255.0;
  6.         const float alpha = this.alpha <= 1.0 ? this.alpha : this.alpha / 255.0;
  7.  
  8.         return [r, g, b, alpha];
  9.     }
  10.  
  11.     ubyte[4] Export() const pure {
  12.         return [this.r, this.g, this.b, this.alpha];
  13.     }
  14.  


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.


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

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
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.

_________________
Yeah! :mrgreen:


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

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

Mit http://www.bilder-hochladen.net klappte das dann wiederum problemlos:
http://www.bilder-hochladen.net/files/j ... a-png.html


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

Registriert: Di Dez 13, 2011 19:14
Beiträge: 166
Wohnort: Hamburg / Mölln
Programmiersprache: D
Ich hab' es jetzt erfolgreich hinbekommen, dass die jeweilige Farbe geändert wird, durch den Aufruf von

Code:
  1.  
  2. this._tex.CreateMaskFromColor(Color.Black.Modify(Color.Spectrum.Alpha, 0), 255);
  3.  


Und diesem Code
Code:
  1.  
  2. void CreateMaskFromColor(const Color col, ubyte alpha) {
  3.     const Color new_col = Color.Red;
  4.  
  5.     ubyte[] color_data;
  6.  
  7.     foreach (const Color pixel_col; this._colors) {
  8.         if (pixel_col != col) {
  9.             color_data ~= pixel_col.Export();
  10.         } else {
  11.             //pixel_col = new_col;
  12.             color_data ~= new_col.Export();
  13.         }
  14.        
  15.         //color_data ~= pixel_col.Export();
  16.     }
  17.  
  18.     this.LoadFromPixels(&color_data[0], this._width, this._height, this._deepth, this._format);
  19. }
  20.  


bekomme ich nun dieses Bild: http://s14.directupload.net/file/d/2899 ... vn_png.htm

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.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Mai 24, 2012 17:19 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
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.

_________________
Yeah! :mrgreen:


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

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 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 Mai 24, 2012 17:41 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Args....Lord Horazont hat natürlich recht.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Mai 24, 2012 18:09 
Offline
DGL Member

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:
Code:
  1.  
  2. /**
  3. *
  4. */
  5. void Draw(const Window wnd) {
  6.     // wenn update
  7.     if (this._need_update) {
  8.         this._BufferMap(wnd.GetWidth(), wnd.GetHeight());
  9.  
  10.         this._need_update = false;
  11.     }
  12.         // hier glAlphaFunc?
  13.     // zeichnen der map
  14.     this._tex.Bind();
  15.  
  16.     //this._buffer[0].PointerTo(Buffer.PtrType.Vertex);
  17.     this._buffer.DrawArrays(Shape.Type.Triangle);
  18.     //b.DrawElements(Shape.Type.Quad, [0, 1, 2, 3]);
  19.     //this._buffer.DrawRangeElements(Shape.Type.Quad, [0, 1, 2, 3]);
  20.    
  21.     //this._buffer[1].PointerTo(Buffer.PtrType.TexCoord);
  22.     //this._buffer[1].DrawArrays(Shape.Type.Quads);
  23.    
  24.     this._buffer.Unbind();
  25. }
  26.  

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ß. -.-


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Mai 24, 2012 21:20 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
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.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Mai 24, 2012 21:31 
Offline
DGL Member

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:

Code:
  1.  
  2. /**
  3. *
  4. */
  5. void Load(string file = "") {
  6.     if (file.length > 0) {
  7.         this._tmr.Read(file);
  8.     }
  9.  
  10.     Surface tileset = new Surface();
  11.  
  12.     const string tileset_file = strip(this._tmr.GetTilesetFile());
  13.     tileset.LoadFromFile(tileset_file);
  14.  
  15.     const ushort tw = this._tmr.GetTileWidth();
  16.     const ushort th = this._tmr.GetTileHeight();
  17.     const ushort tiles_each_line = cast(ushort)(tileset.Width / tw);
  18.  
  19.     Surface[ushort] tiles;
  20.  
  21.     ushort count = 0;
  22.  
  23.     Rect tile_rect = new Rect(0, 0, tw, th);
  24.  
  25.     foreach (const Tile t; this._tmr.GetTiles()) {
  26.         if (t.Gid !in tiles) {
  27.             const ushort[2] pos = CalcPos(t.Gid, tiles_each_line, tw, th);
  28.  
  29.             tile_rect.SetPosition(pos[0], pos[1]);
  30.  
  31.             tiles[t.Gid] = tileset.SubSurface(tile_rect);
  32.  
  33.             ++count;
  34.         }
  35.     }
  36.  
  37.     ushort size = 2;
  38.     while (size < count) {
  39.         size *= 2;
  40.     }
  41.  
  42.     if (size > 2) {
  43.         size = cast(ushort) floor(sqrt(cast(float) size));
  44.     }
  45.  
  46.     writefln("count: %d, size: %d", count, size);
  47.  
  48.     const ushort w = cast(ushort)(size * tw); // (count > 2 ? size : count)
  49.     const ushort h = cast(ushort)(size * th);
  50.  
  51.     writefln("w: %d, h: %d", w, h);
  52.  
  53.     Surface new_tileset = new Surface();
  54.     new_tileset.Create(w, h, 32);
  55.  
  56.     ushort line, column;
  57.  
  58.     //Rect clip = new Rect(0, 0, tw, th);
  59.     tile_rect.SetPosition(0, 0);
  60.  
  61.     this._vtable.clear();
  62.  
  63.     foreach (ushort gid, Surface tile; tiles) {
  64.         new_tileset.Blit(tile, tile_rect);
  65.  
  66.         this._vtable[gid] = [tile_rect.x, tile_rect.y];
  67.  
  68.         column++;
  69.         if (column >= size) {
  70.             column = 0;
  71.  
  72.             line++;
  73.         }
  74.  
  75.         const ushort rx = cast(ushort)(column * tile_rect.Width);
  76.         const ushort ry = cast(ushort)(line * tile_rect.Height);
  77.  
  78.         //writefln("rx: %d, ry: %d", rx, ry);
  79.  
  80.         tile_rect.SetPosition(rx, ry);
  81.     }
  82.  
  83.     new_tileset.SaveToFile("img/Tiled/new_tileset.png");
  84.  
  85.     Texture.Format fmt;
  86.     if (new_tileset.IsMask(Surface.Mask.Red, 0x000000FF)) {
  87.         fmt = Texture.Format.None;
  88.     } else {
  89.         fmt = (new_tileset.CountBytes() == 4) ? Texture.Format.BGRA : Texture.Format.BGR;
  90.     }
  91.  
  92.     //writefln("CountBits: %d", new_tileset.CountBits());
  93.  
  94.     this._tex.LoadFromPixels(new_tileset.GetPixels(), w, h, new_tileset.CountBits(), fmt);
  95.     /*
  96.     this._tex.CreateMaskFromColor(Color.Black.Modify(Color.Spectrum.Alpha, 0), 255);
  97.     this._tex.SetBlendMode(Texture.BlendMode.Multiply);
  98.     */
  99.  
  100.     this._need_update = true;
  101. }
  102.  
  103. /**
  104. *
  105. */
  106. void Draw(const Window wnd) {
  107.     // wenn update
  108.     if (this._need_update) {
  109.         this._BufferMap(wnd.GetWidth(), wnd.GetHeight());
  110.  
  111.         this._need_update = false;
  112.     }
  113.  
  114.     if (!glIsEnabled(GL_ALPHA_TEST)) {
  115.         glEnable(GL_ALPHA_TEST);
  116.     }
  117.  
  118.     // zeichnen der map
  119.     this._tex.Bind();
  120.  
  121.     //this._buffer[0].PointerTo(Buffer.PtrType.Vertex);
  122.     this._buffer.DrawArrays(Shape.Type.Triangle);
  123.     //b.DrawElements(Shape.Type.Quad, [0, 1, 2, 3]);
  124.     //this._buffer.DrawRangeElements(Shape.Type.Quad, [0, 1, 2, 3]);
  125.    
  126.     //this._buffer[1].PointerTo(Buffer.PtrType.TexCoord);
  127.     //this._buffer[1].DrawArrays(Shape.Type.Quads);
  128.    
  129.     this._buffer.Unbind();
  130. }
  131.  


Dann einmal die "Create" Funktion der Surface Klasse, mit der ich das neue Tileset erstelle:
Code:
  1.  
  2. Surface Create(ushort width, ushort height, ubyte deepth) {
  3.     this.Free();
  4.  
  5.     this._surface = SDL_Check(SDL_CreateRGBSurface(
  6.         0,
  7.         width, height,
  8.         deepth,
  9.         0, 0, 0, 0
  10.     ));
  11.  
  12.     return this;
  13. }
  14.  


und zu guter letzt nochmal meine "BufferMap" Methode:
Code:
  1.  
  2. void _BufferMap(ushort wnd_width, ushort wnd_height) {
  3.     assert(this._view !is null);
  4.  
  5.     Vertex[] vertices  = [];
  6.     Vertex[] texCoords = [];
  7.  
  8.     const ushort tw = this._tmr.GetTileWidth();
  9.     const ushort th = this._tmr.GetTileHeight();
  10.  
  11.     const float ts_width  = this._tex.Width;
  12.     const float ts_height = this._tex.Height;
  13.  
  14.     ushort outofrange_bigger_counter = 0;
  15.     ushort outofrange_lower_counter  = 0;
  16.  
  17.     const short neg_tw = cast(short)(tw * -2);
  18.     const short neg_th = cast(short)(th * -2);
  19.  
  20.     const Vector2f scroll = this._view.GetScrolling();
  21.  
  22.     foreach (const Tile t; this._tmr.GetTiles()) {
  23.         const ushort tx = cast(ushort)(t.Position.x + scroll.x);
  24.         const ushort ty = cast(ushort)(t.Position.y + scroll.y);
  25.  
  26.         // if overlap in positive x/y, cut
  27.         if (tx >= wnd_width || ty >= wnd_height) {
  28.             outofrange_bigger_counter++;
  29.  
  30.             continue;
  31.         }
  32.  
  33.         // also, if overlap in negative x/y, cut
  34.         if (tx < 0 || ty < 0) {
  35.             outofrange_lower_counter++;
  36.  
  37.             continue;
  38.         }
  39.  
  40.         vertices ~= Vertex(tx, ty);
  41.         vertices ~= Vertex(tx + tw, ty);
  42.         vertices ~= Vertex(tx, ty + th);
  43.         vertices ~= Vertex(tx + tw, ty + th);
  44.  
  45.         //writefln("tx: %d, ty: %d", tx, ty);
  46.  
  47.         const ushort[2] pos = this._vtable[t.Gid];
  48.  
  49.         texCoords ~= Vertex(pos[0] / ts_width, pos[1] / ts_height);
  50.         texCoords ~= Vertex((pos[0] + tw) / ts_width, pos[1] / ts_height);
  51.         texCoords ~= Vertex(pos[0] / ts_width, (pos[1] + th) / ts_height);
  52.         texCoords ~= Vertex((pos[0] + tw) / ts_width, (pos[1] + th) / ts_height);
  53.     }
  54.  
  55.     writefln("Out of Range > Total: %d, lower: %d, bigger: %d",
  56.              outofrange_lower_counter + outofrange_bigger_counter,
  57.              outofrange_lower_counter,
  58.              outofrange_bigger_counter);
  59.  
  60.     //this._buffer.Switch(0);
  61.     this._buffer[0].Cache(vertices);
  62.     this._buffer.PointerTo(Buffer.PtrType.Vertex);
  63.  
  64.     this._buffer[1].Cache(texCoords);
  65.     this._buffer.PointerTo(Buffer.PtrType.TexCoord);
  66.  
  67.     writefln("vertices: %d, texCoords: %d", vertices.length, texCoords.length);
  68. }
  69.  


Wenn jemand irgendwelche Performance Lecks findet oder Verbesserungsvorschläge, wäre ich damit auch schon sehr glücklich. :)
Danke.


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 Vorherige  1, 2, 3  Nächste
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

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.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.013s | 15 Queries | GZIP : On ]