alpha und depthbuffer

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.
Antworten
Benutzeravatar
marcgfx
Establishment
Beiträge: 2050
Registriert: 18.10.2010, 23:26

alpha und depthbuffer

Beitrag von marcgfx »

131019glProblem.jpg
Problem 1
ich setze den z wert im vertex-shader.
die z-reihenfolge stimmt, wenn ich gl.enable(gl.DEPTH_TEST) setze, allerdings geht dann das blending kaputt... linkes bild ist mit DEPTH_TEST rechts ohne. wie kann ich beides gleichzeitig zum laufen bringen?
ich habe gelesen, dass man selbst vorsortieren muss für das blending, ist das korrekt? Ich habe es jetzt zumindest mal so gelöst.

Code: Alles auswählen

gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);//premultiplied alpha
    gl.enable ( gl.BLEND ) ;
    gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true);
    //gl.enable(gl.DEPTH_TEST);
    gl.depthFunc(gl.LEQUAL);
Problem 2
wie im bild oben rechts ersichtlich gibt es bei überlagerungen von schatten dunklere bereiche. bislang hatte ich mich damit abgefunden, aber eigentlich müsste es doch möglich sein dies zu beheben. ich versuch jetzt schon seit etwa zwei stunden mit blending dahinter zu kommen, aber bislang ohne erfolg. auf dem alpha-kanal müsste ich eine art Max function haben. hab online ein cooles tool gefunden, aber ich find keine passende kombination http://mrdoob.github.io/webgl-blendfunc ... arate.html.
Benutzeravatar
dot
Establishment
Beiträge: 1734
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: alpha und depthbuffer

Beitrag von dot »

marcgfx hat geschrieben:wie kann ich beides gleichzeitig zum laufen bringen?
Tut es doch. Und macht genau, was es machen soll... ;)

Du meinst wohl: Wie kann ich es dazu bringen, dass es tut, was ich gerne hätte, nämlich die Fragmente automatisch nach der Tiefe sortiert blenden?
Geht leider nicht, zumindest nicht im Moment in purem OpenGL ohne irgendwelchen herstellerspezifischen Extensions...
marcgfx hat geschrieben:ich habe gelesen, dass man selbst vorsortieren muss für das blending, ist das korrekt?
ja

Ich würde mir generell überlegen, was so ein Depth Buffer in einer 2D Anwendung mir überhaupt genau bringt, von verschwendeter Speicherbandbreite mal abgesehen... ;)
marcgfx hat geschrieben:wie im bild oben rechts ersichtlich gibt es bei überlagerungen von schatten dunklere bereiche. bislang hatte ich mich damit abgefunden, aber eigentlich müsste es doch möglich sein dies zu beheben.
Nettes Tool; so ein max() gibt es, aber die glBlendFunc bestimmt eben nur, wie das Alpha, das rauskommt aussieht und nicht das, welches zum Blenden der Farben verwendet wird. Eine sehr einfache Lösung wär wohl, die Schatten erst separat in einen Buffer zu rendern und diesen dann über das Bild zu blenden, bevor der Rest gezeichnet wird. Evtl. kann man sich tatsächlich einen Trick mit dem Blending überlegen, da müsste man wohl noch etwas drüber nachdenken. Aber atm bin ich mir nichtmal sicher, ob das mit den Möglichkeiten von glBlendFuc() rein prinzipiell überhaupt gehen kann...
Spiele Programmierer
Establishment
Beiträge: 426
Registriert: 23.01.2013, 15:55

Re: alpha und depthbuffer

Beitrag von Spiele Programmierer »

Mit "glBlendEquation" oder "glBlendEquationSeparate" kannst du auf eine Maximum-Funktion umstellen. Ich glaube jedoch auch, dass das nur funktioniert wenn du die Schatten vorher in einen seperaten Buffer renderst und erst am Ende das Ergebnis mit dem Bild verrechnest.
Benutzeravatar
marcgfx
Establishment
Beiträge: 2050
Registriert: 18.10.2010, 23:26

Re: alpha und depthbuffer

Beitrag von marcgfx »

danke für die infos, echt ne grosse hilfe! glBlendEquationSeparate, wäre genau was ich brauche. leider konnte ich von http://www.nihilogic.dk/labs/webgl_chea ... _Sheet.htm entnehmen das min und max nicht unterstützt sind. typisch.

Code: Alles auswählen

void blendEquation ulong mode Specify the equation used for both the RGB blend equation and the Alpha blend equation. Accepted values for mode are:
FUNC_ADD FUNC_SUBTRACT
FUNC_REVERSE_SUBTRACT
Benutzeravatar
dot
Establishment
Beiträge: 1734
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: alpha und depthbuffer

Beitrag von dot »

glBlendEquationSeparate() erlaubt dir nur, für Alpha und Farbe unterschiedliche Blend Functions zu verwenden. Das Farbblending bekommt dabei nicht plötzlich Zugriff auf die geblendeten Alphawerte...
Spiele Programmierer
Establishment
Beiträge: 426
Registriert: 23.01.2013, 15:55

Re: alpha und depthbuffer

Beitrag von Spiele Programmierer »

Eine andere Idee für Schatten wäre der Stencilbuffer. Am Anfang ist überall der Stencilwert 0. Bei Schatten setzt du den Stencilbuffer auf 1. Am Ende verdunkelst du mit einen Screenquad einfach überall wo der Stancilwert größer 0 ist.
Benutzeravatar
marcgfx
Establishment
Beiträge: 2050
Registriert: 18.10.2010, 23:26

Re: alpha und depthbuffer

Beitrag von marcgfx »

würde das auch abgestuften schatten erlauben? die idee einen eigenen alpha-kanal zu rendern für die ganze szene favorisiere ich momentan, RGB normal rendern und dann zusammenmischen. ihr seht ich habe keine ahnung von der terminologie aber das entspricht ungefähr schon dem was ich in canvas für meine spritesheets mache. obwohl aktuell ist mir das ziemlich wurst, ich muss erst mal schauen ob ich überhaupt eine brauchbare performance erzielen kann bevor ich anfange zu verbessern :)
Spiele Programmierer
Establishment
Beiträge: 426
Registriert: 23.01.2013, 15:55

Re: alpha und depthbuffer

Beitrag von Spiele Programmierer »

Nein, mit dem Stencilbuffer gehen keine abgestuften Schatten.
Die Max-Funktion wäre für abgestufte Schatten auch nicht korrekt. Die Durchlässigkeiten mutliplizieren sich. Durch zwei zu 50% durchlässigen Objekten käme nur 25% des Lichtes durch. (75% Schatten)
Das sollte sich in OpenGL umsetzen lassen. Dafür brauchst du nur einen Buffer der die Durchlässigkeit zur Lichtquelle angibt und mit 1.0 gecleart ist.
Schatten kannst du dann multiplikativ dazu blenden. (100% Schatten: 0.0 \ 0% Schatten: 1.0)
Am Ende kannst du dann ein schwarzes Fullscreenquad einfach mit den Werten aus dem Buffer aus blenden. Dieses Vorgehen sollte sich sogar theoretisch auf farbige Schatten erweitern lassen.
Benutzeravatar
Blue Cobold
Beiträge: 58
Registriert: 13.06.2001, 00:00
Kontaktdaten:

Re: alpha und depthbuffer

Beitrag von Blue Cobold »

Ich bin mir nicht sicher, ob die Anforderung für transparente Objekte und farbige Schatten überhaupt vorhanden ist.
Benutzeravatar
Sternmull
Establishment
Beiträge: 264
Registriert: 27.04.2007, 00:30
Echter Name: Til
Wohnort: Dresden

Re: alpha und depthbuffer

Beitrag von Sternmull »

Ich hab nicht groß überlegt ob/wie das realisierbar ist, aber: Wenn die Schatten grundsätzlich nur verdunkeln sollen, und es an den schattierten Stellen "höchstens so dunkel sein soll wie der dunkelste Schatten der diese Stelle trifft", dann müsste es doch eigentlich gehen wenn man die Schatten-Sprites mit einer min-Funktion rendert. Dann bleibt der dunkelste Farbwert übrig, die Dunkelheit verschiedener Schatten addiert sich aber nicht. Das sollte dann genau das sein was man erwartet.

Wie schon gesagt hab ich jetzt nicht nachgeguckt ob das geht. Aber wenn es eine max-Funktion gibt, dann sollte es wohl auch eine min-Funktion geben ;)
Benutzeravatar
Blue Cobold
Beiträge: 58
Registriert: 13.06.2001, 00:00
Kontaktdaten:

Re: alpha und depthbuffer

Beitrag von Blue Cobold »

Dann sind Schatten aber nicht mehr mit Antialiasing versehen.
Benutzeravatar
Sternmull
Establishment
Beiträge: 264
Registriert: 27.04.2007, 00:30
Echter Name: Til
Wohnort: Dresden

Re: alpha und depthbuffer

Beitrag von Sternmull »

Ist auch wahrscheinlich eh hinfällig weil es bei WebGL scheinbar keinen min-Blendmodus gibt. Normalerweise würde man das mit EXT_blend_minmax.
Benutzeravatar
marcgfx
Establishment
Beiträge: 2050
Registriert: 18.10.2010, 23:26

Re: alpha und depthbuffer

Beitrag von marcgfx »

der hinweis mit den transparenten objekten ist ein guter... transparente objekte gibt es. damit es keine probleme gibt müsste ich sicherstellen, dass der schatten immer transparenter ist als transparente objekte (damit die idee, die sowieso nicht so einfach umsetzbar ist umsetzbar wird :) ). auf alle fälle werde ich für alpha noch einen float-buffer brauchen, was mich jetz aber grad ein bisschen nervt :(
Benutzeravatar
dot
Establishment
Beiträge: 1734
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: alpha und depthbuffer

Beitrag von dot »

marcgfx hat geschrieben:auf alle fälle werde ich für alpha noch einen float-buffer brauchen, was mich jetz aber grad ein bisschen nervt :(
Wieso?
Benutzeravatar
marcgfx
Establishment
Beiträge: 2050
Registriert: 18.10.2010, 23:26

Re: alpha und depthbuffer

Beitrag von marcgfx »

mal sehen ob ich das richtig verstanden habe:
damit ich alles in einem draw-call übergeben kann, muss ich alle variablen im vertex-shader setzen. damit ich dies tun kann, muss ich die werte alle in einen buffer laden. ist nicht schlimm, aber es ist noch ein buffer mehr :)
aktuell habe ich vor den zusätzlichen float buffer für flags zu nutzen. z.b. bei 0.1 -> alpha 50%, 0.2 -> ausgrauen, 0.3 -> flackern... etc. ist das ne gute idee?

was mir noch als option einfällt: ich habe einige vec2 attribute, ist es effizienter ein vec4 statt zwei vec2 attribute zu führen?
Benutzeravatar
marcgfx
Establishment
Beiträge: 2050
Registriert: 18.10.2010, 23:26

Re: alpha und depthbuffer

Beitrag von marcgfx »

aktuell find ichs grad selber ne gute idee, funktioniert auf alle fälle super. jetzt hab ich mit diesem float gleich zig verschiedene modi zur verfügung. aktuell (alpha, hsv operationen, ausgrauen, sepia, heller, dunkler), allerdings jede operation nur für sich, ich kann sie nicht kombinieren. als experiment denke ich gelungen, wenn ich wirklich was spezifisches brauche, kann ich das denke ich ohne gross aufwand einfügen.
Spiele Programmierer
Establishment
Beiträge: 426
Registriert: 23.01.2013, 15:55

Re: alpha und depthbuffer

Beitrag von Spiele Programmierer »

Ich habe zwar nicht ganz verstanden was du jetzt erreichen willst, aber ich kann es mir nicht sinnvoll vorstellen.

Insbesondere frage ich mich von welchen "Buffer" du redest? Eine Textur? Einen Fragment Buffer? Einen Uniform Buffer? Oder neue Vertex Attribute?
0.1 -> alpha 50%, 0.2 -> ausgrauen, 0.3 -> flackern
Ja, aber warum jetzt einen Gleitkommabuffer?
8 Bit Integerwerte würden auch für 256 verschiedene Modi reichen und viel Bandbreite sparen.
jetzt hab ich mit diesem float gleich zig verschiedene modi zur verfügung. aktuell (alpha, hsv operationen, ausgrauen, sepia, heller, dunkler),
Irgendwie klingt das nicht sinnvoll. Es sieht für mich so aus, als ob du Post Processing für Farbeffekte umsetzten willst. Sinnvoller erscheint mir hierfür eine Farbmatrix oder eine kleinen Volumentextur(zb. 8³) zur Farbumrechnung. Beides wäre sehr flexibel und kommt im Shader ohne irgendwelche ungünstigen bzw. vor allen Dingen überflüssigen Verzweigungen aus.
Zuletzt geändert von Spiele Programmierer am 04.06.2014, 10:34, insgesamt 1-mal geändert.
Benutzeravatar
marcgfx
Establishment
Beiträge: 2050
Registriert: 18.10.2010, 23:26

Re: alpha und depthbuffer

Beitrag von marcgfx »

4ter tag webgl, naja check noch einiges nicht ;). wusste nicht dass man 8bit integer an den vertexbuffer übergeben kann? aktuell ist es eher so 0->0.1 sind alpha von 0-1, die anderen modi sind auch grossteils mit fliessenden übergängen. aber hast recht, wirklich sinn machts für das oben beschriebene nicht einen float zu nehmen. farbmatrik, muss ich mir mal anschauen. die verzweigungen im shader scheinen nicht gross einfluss auf die performance zu haben (aktuell), aber ich lerne gerne was dazu ;)
Antworten