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

Aktuelle Zeit: Fr Jul 18, 2025 08:07

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Multipass => Multitexture Probleme
BeitragVerfasst: So Apr 05, 2009 17:38 
Offline
DGL Member

Registriert: So Apr 05, 2009 15:08
Beiträge: 5
Hallo,

ich versuche gerade meine TileMap-Engine von Multipass auf Multitexturing umzustellen und komme leider nicht weiter. Für meine Level muss ich mehrere Tiles (bis zu 5) übereinander legen, die Tiles sind teilweise transparent.
Momentan verwende ich Multipass Rendering und verwende einfach GL_SRC_ALPHA / GL_ONE_MINUS_SRC_ALPHA für das blending. Dies ist jedoch relativ langsam da ich teilweise bis zu 5 Tiles übereinander legen muss.
Um dies nun zu beschleunigen möchte ich gerne Multitexturing verwenden.

Für die Farb-Verrechnung ist wohl INTERPOLATE der richtige Modus da die Transparenz der 2. Textur die untere "durchscheinen" lässt.

Leider habe ich hier das Problem dass ich mit der Verrechnung der Transparenzen nicht klar komme.

Beispiel:

Was ich will:
Code:
  1.  
  2. . = transparent
  3.  
  4. . . . . .   . . B . .    . . B . .
  5. . . . . .   . . B . .    . . B . .
  6. A A A A A + . . B . . => A A B A A
  7. . . . . .   . . B . .    . . B . .
  8. . . . . .   . . B . .    . . B . .
  9.  


Was ich momentan erhalte:
Code:
  1.  
  2. . . . . .   . . B . .    . . . . .
  3. . . . . .   . . B . .    . . . . .
  4. A A A A A + . . B . . => . . B . .
  5. . . . . .   . . B . .    . . . . .
  6. . . . . .   . . B . .    . . . . .
  7.  

D.h. die Transparenzen werden momentan wohl multipliziert weshalb alle Tile die im einen oder anderen Tile transparent sind auch im Ergenis durchsichtig sind.

Mir ist einfach nicht klar wir ich die Transparenzen verrechnen soll.

MODULATE (multiplikation) passt nicht, da dies dazu führt dass eine transparente Textur unter einer undurchsichtigen Textur zu einer halbtransparenten Textur führt...
ADD (addition) passt nicht, da dann 70% sichtbar auf 30% sichtbar zu 100% führt was aber auch nicht richtig ist.
REPLACE passt nicht da ein durchsichtiger Bereich auf der 2. Textur dann die komplette Textur durchsichtig macht.
INTERPOLATE scheint auch nicht wirklich den Sinn zu machen...

Kann mir bitte jemand helfen? Am besten einen kleinen Sourcecode-Abschnitt wie ich die Texturen und Modi (TexEnv) aktivieren muss.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Apr 05, 2009 19:14 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 27, 2005 12:44
Beiträge: 393
Wohnort: Berlin
Programmiersprache: Java, C++, Groovy
Hallo,

scheint so als wäre GL_DECAL der richtige Parameter für deinen Fall. ( siehe glTexEnv ).
In neueren GL-Versionen hast du für glTexEnv noch viele weitere Einstellmöglichkeiten. ( schau mal in die aktuellen specs )

Falls nicht, kannst du es mit einem Shader versuchen, da hättest du dann die vollständige Kontrolle ;)

Viele Grüße
dj3hut1

_________________
Wenn Gauß heute lebte, wäre er ein Hacker.
Peter Sarnak, Professor an der Princeton University


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Apr 05, 2009 20:02 
Offline
DGL Member

Registriert: So Apr 05, 2009 15:08
Beiträge: 5
DECAL hatte ich auch schon getestet. Aber das Problem ist, dass die Transparenz hier von der einer Textur übernommen wird. In dem Fall oben hab ich dann

Code:
  1.  
  2. . . . . .   . . B . .    . . . . .
  3. . . . . .   . . B . .    . . . . .
  4. A A A A A + . . B . . => A A B A A
  5. . . . . .   . . B . .    . . . . .
  6. . . . . .   . . B . .    . . . . .
  7.  


jedenfalls hatte ich das beobachtet und es entspricht ja auch so der Beschreibung...

Ich bräuchte also eher was, was die Transparenzen "verodert" ...

An Shader traue ich mich momentan noch nicht ran - fange erst an mit dem OpenGL ;-)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Apr 05, 2009 21:36 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 27, 2005 12:44
Beiträge: 393
Wohnort: Berlin
Programmiersprache: Java, C++, Groovy
Hallo,

Theoretisch kannst du dir jede beliebige Funktion beim Multitexturing zusammenbasteln.
Bin mir nicht ganz sicher, aber kann sein dass du als Argumente für glTexEnv folgendes nehmen musst :

Code:
  1.  
  2. GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_INTERPOLATE
  3. GL_TEXTURE_ENV, GL_SRC0_RGB, GL_TEXTUREn
  4. GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR
  5. GL_TEXTURE_ENV, GL_SRC1_RGB, GL_PREVIOUS
  6. GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR
  7. GL_TEXTURE_ENV, GL_SRC2_RGB, GL_TEXTUREn
  8. GL_TEXTURE_ENV, GL_OPERAND2_RGB, GL_SRC_ALPHA
  9.  
  10. GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_MODULATE
  11. GL_TEXTURE_ENV, GL_SRC0_ALPHA, GL_TEXTUREn
  12. GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA
  13. GL_TEXTURE_ENV, GL_SRC1_ALPHA, GL_PREVIOUS
  14. GL_TEXTURE_ENV, GL_OPERAND1_ALPHA, GL_SRC_ALPHA
  15.  



wobei GL_TEXTUREn die jeweilige Textur ist.
Interpolate bedeutet dabei Arg0 * Arg2 + Arg1 * (1 - Arg2) und Modulate Arg0 * Arg1.

Das würde dann genau der vorherigen Blend-Funktion entsprechen.

Oder brauchst du für Alpha eher so eine Art Maximumsfunktion?

Viele Grüße
dj3hut1

_________________
Wenn Gauß heute lebte, wäre er ein Hacker.
Peter Sarnak, Professor an der Princeton University


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Apr 05, 2009 22:05 
Offline
DGL Member

Registriert: So Apr 05, 2009 15:08
Beiträge: 5
Hm.

Code:
  1.  
  2.     glActiveTexture(GL_TEXTURE0);
  3.     glClientActiveTexture( GL_TEXTURE0 );
  4.     glEnable(GL_TEXTURE_2D);
  5.     glBindTexture(GL_TEXTURE_2D, [texture name]);
  6.     glTexCoordPointer(2, GL_FLOAT, sizeof(ccMultiVertex), &quads[0].bl.t0x);
  7.     glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE );
  8.     glTexEnvi( GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_REPLACE );
  9.  
  10.     glActiveTexture(GL_TEXTURE1);
  11.     glClientActiveTexture( GL_TEXTURE1 );
  12.     glEnable(GL_TEXTURE_2D);
  13.     glBindTexture(GL_TEXTURE_2D, [texture name]);
  14.     glTexCoordPointer(2, GL_FLOAT, sizeof(ccMultiVertex), &quads[0].bl.t1x);   
  15.  
  16.     glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE );
  17.     glTexEnvi( GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_INTERPOLATE );
  18.     glTexEnvi( GL_TEXTURE_ENV, GL_SRC0_RGB, GL_TEXTURE0 );
  19.     glTexEnvi( GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR );
  20.     glTexEnvi( GL_TEXTURE_ENV, GL_SRC1_RGB, GL_PREVIOUS );
  21.     glTexEnvi( GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR );
  22.     glTexEnvi( GL_TEXTURE_ENV, GL_SRC2_RGB, GL_TEXTURE1 );
  23.     glTexEnvi( GL_TEXTURE_ENV, GL_OPERAND2_RGB, GL_SRC_ALPHA );
  24.  
  25.     glTexEnvi( GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_MODULATE );
  26.     glTexEnvi( GL_TEXTURE_ENV, GL_SRC0_ALPHA, GL_TEXTURE1 );
  27.     glTexEnvi( GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA );
  28.     glTexEnvi( GL_TEXTURE_ENV, GL_SRC1_ALPHA, GL_PREVIOUS );
  29.     glTexEnvi( GL_TEXTURE_ENV, GL_OPERAND1_ALPHA, GL_SRC_ALPHA );
  30.    
  31.     glEnableClientState(GL_TEXTURE_COORD_ARRAY);
  32.     glVertexPointer(3, GL_FLOAT, sizeof(ccMultiVertex), &quads[0].bl.vx);
  33.     glDrawElements(GL_TRIANGLES, n*6, GL_UNSIGNED_SHORT, indices); 
  34.  


(Der Code hier ist ObjectiveC - aber unter Delphi hätte ich das gleiche Problem ...) :lol:

Das was hier schwarz ist ist in den Texturen transparent.

Wenn ich nun Modulate verwende passiert eben genau das:

Alpha1 = 255
Alpha2 = 0
=> Alpha1 * Alpha2 = 0

Alpha1 = 0
Alpha2 = 255
=> Alpha1 * Alpha2 = 0

D.h. wenn ein Teil einer Textur Transparent ist so ist er auch in der Ergebnis-Textur transparent :?

Das Ergebnis sollte aber ein hübsches Gitter sein...


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Apr 05, 2009 22:23 
Offline
DGL Member

Registriert: So Apr 05, 2009 15:08
Beiträge: 5
Oh - oben hatte ich noch einen Typo drin: GL_TEXTURE0 => GL_TEXTURE1 bei GL_SRC0_RGB. Aber das verändert das Alpha-Problem leider nicht sondern nur das Aussehen der Textur...


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Apr 06, 2009 02:22 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
Also müsstest du den Alpha-Wert ausummieren. Ein "oder" entspricht ja einer Addition ohne Überlauf.
Ob das bei Halb-Transparenz auch wirklich so funktioniert wie du das gern hättest, kann ich jetzt nicht sagen, aber die Beispiele haben ja auch recht scharfe Kanten, also sieht man den Unterschied wohl nicht.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Apr 06, 2009 07:41 
Offline
DGL Member

Registriert: So Apr 05, 2009 15:08
Beiträge: 5
Hurra - hab's :D - oder zumindest mal ein passables Zwischenergebnis...

Der Trick besteht darin die Transparenz-Berechnung mit (1-alpha) durchzuführen:

1. Man füllt den Puffer mit der Textur und 1-alpha
2. Man verrechnet die Transparenzen dann mit 1-alpha
3. Beim Blending stellt man auf glBlendFunc(GL_ONE_MINUS_SRC_ALPHA, GL_SRC_ALPHA);

Code:
  1.  
  2.     glClearColor(0,128,0,128);
  3.     glActiveTexture(GL_TEXTURE0);
  4.     glClientActiveTexture( GL_TEXTURE0 );
  5.     glEnable(GL_TEXTURE_2D);
  6.     glBindTexture(GL_TEXTURE_2D, [texture name]);
  7.     glTexCoordPointer(2, GL_FLOAT, sizeof(ccMultiVertex), &quads[0].bl.t0x);
  8.     glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE );
  9.     glTexEnvi( GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_REPLACE );
  10.     glTexEnvi( GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_REPLACE );
  11.     glTexEnvi( GL_TEXTURE_ENV, GL_SRC0_ALPHA, GL_TEXTURE );
  12.     glTexEnvi( GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
  13.  
  14.     glActiveTexture(GL_TEXTURE1);
  15.     glClientActiveTexture( GL_TEXTURE1 );
  16.     glEnable(GL_TEXTURE_2D);
  17.     glBindTexture(GL_TEXTURE_2D, [texture name]);
  18.     glTexCoordPointer(2, GL_FLOAT, sizeof(ccMultiVertex), &quads[0].bl.t1x);   
  19.  
  20.     glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE );
  21.     glTexEnvi( GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_INTERPOLATE );
  22.     glTexEnvi( GL_TEXTURE_ENV, GL_SRC0_RGB, GL_TEXTURE1 );
  23.     glTexEnvi( GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR );
  24.     glTexEnvi( GL_TEXTURE_ENV, GL_SRC1_RGB, GL_PREVIOUS );
  25.     glTexEnvi( GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR );
  26.     glTexEnvi( GL_TEXTURE_ENV, GL_SRC2_RGB, GL_TEXTURE1 );
  27.     glTexEnvi( GL_TEXTURE_ENV, GL_OPERAND2_RGB, GL_SRC_ALPHA );
  28.  
  29.     glTexEnvi( GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_MODULATE );
  30.     glTexEnvi( GL_TEXTURE_ENV, GL_SRC0_ALPHA, GL_PREVIOUS );
  31.     glTexEnvi( GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA );
  32.     glTexEnvi( GL_TEXTURE_ENV, GL_SRC1_ALPHA, GL_TEXTURE );
  33.     glTexEnvi( GL_TEXTURE_ENV, GL_OPERAND1_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
  34.  
  35.     glEnableClientState(GL_TEXTURE_COORD_ARRAY);
  36.     glVertexPointer(3, GL_FLOAT, sizeof(ccMultiVertex), &quads[0].bl.vx);
  37.  
  38.     glBlendFunc(GL_ONE_MINUS_SRC_ALPHA, GL_SRC_ALPHA);
  39.    
  40.     glDrawElements(GL_TRIANGLES, n*6, GL_UNSIGNED_SHORT, indices); 
  41.  
  42.  


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 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.010s | 16 Queries | GZIP : On ]