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:
. = transparent
. . . . . . . B . . . . B . .
. . . . . . . B . . . . B . .
A A A A A + . . B . . => A A B A A
. . . . . . . B . . . . B . .
. . . . . . . B . . . . B . .
Was ich momentan erhalte:
Code:
. . . . . . . B . . . . . . .
. . . . . . . B . . . . . . .
A A A A A + . . B . . => . . B . .
. . . . . . . B . . . . . . .
. . . . . . . B . . . . . . .
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.
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
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:
. . . . . . . B . . . . . . .
. . . . . . . B . . . . . . .
A A A A A + . . B . . => A A B A A
. . . . . . . B . . . . . . .
. . . . . . . B . . . . . . .
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
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:
GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_INTERPOLATE
GL_TEXTURE_ENV, GL_SRC0_RGB, GL_TEXTUREn
GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR
GL_TEXTURE_ENV, GL_SRC1_RGB, GL_PREVIOUS
GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR
GL_TEXTURE_ENV, GL_SRC2_RGB, GL_TEXTUREn
GL_TEXTURE_ENV, GL_OPERAND2_RGB, GL_SRC_ALPHA
GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_MODULATE
GL_TEXTURE_ENV, GL_SRC0_ALPHA, GL_TEXTUREn
GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA
GL_TEXTURE_ENV, GL_SRC1_ALPHA, GL_PREVIOUS
GL_TEXTURE_ENV, GL_OPERAND1_ALPHA, GL_SRC_ALPHA
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
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...
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.
Hurra - hab's - 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);
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.