PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : OpenGL/GLSL Blending: Separate Blend-Factors für R, G, B möglich?


AwesomeSauce
2014-03-14, 20:48:42
Hallo zusammen

Ich implementiere derzeit einen Shader, der im wesentlichen daraus besteht, vier separierbare Gaussian-Blurs mit unterschiedlichen Varianzen zu berechnen und die Resultate mit unterschiedlichen Gewichtungen für jede Varianz, aber auch für jeden Farbkanal zu verrechnen. Konzeptionell spielt sich das so ab:

res = Blur(var1) * weight1 + Blur(var2) * weight2 + ..., wobei weight[i] ein RGB-Vektor ist

Nun hatte ich eigentlich vor, für die Akkumulierung Blending zu benutzen. In D3D könnte ich ja über SetBlendState einfach verschiedene Blend-Factors für die Farbkanäle setzen. Auf die Schnelle habe ich keine Möglichkeit gefunden (der StackOverflow-Thread ist schon älter: http://stackoverflow.com/questions/2818351/per-component-alpha-channels-with-opengl), ähnliches in OGL/GLSL zu handhaben. Gibt es sowas wirklich nicht?. Ich hoffe, dass sich jemand hier schon etwas länger mit OpenGL und GLSL beschäftigt und mir eine Antwort geben kann. Plattform ist OpenGL 4.3 mit entsprechender GLSL Version.

Vielen Dank

hell_bird
2014-03-14, 23:18:47
Bin jetzt nicht ganz sicher ob ich die Frage richtig verstanden habe. Du kannst ja die Kanäle im Shader schon vormultiplizieren mit dem Faktor und beim blending einfach nur noch aufaddieren lassen. Alternativ: warum berechnest du nicht alles in einem Durchlauf?

AwesomeSauce
2014-03-15, 00:56:48
Ich bin mir bewusst, dass ich den gewünschten Effekt auf andere Arten erzielen kann. Ich war mir nur nicht sicher, ob ich etwas übersehen habe ;)

In einem Rutsch wäre nur möglich, wenn ich immer mit dem ungeblurrten Rendertarget als Basis arbeiten würde. Bei gleicher Sample-Zahl erreiche ich aber bessere Qualität, wenn ich für Blurs mit grösserer Varianz einfach eine bereits vorgefilterte Textur noch weiter filtere.

ScottManDeath
2014-03-15, 02:15:37
Welchen State nutzt Du fuer D3D?

Es gibt glBlendColor bzw GL_BLEND_COLOR

AwesomeSauce
2014-03-15, 11:59:41
In D3D würde das etwa so aussehen:

BlendState Accumulate{
[...]
SrcBlend = BLEND_FACTOR;
DestBlend = INV_BLEND_FACTOR;
};
[...]
SetBlendState(Accumulate, w, 0xFFFFFFFF);

wobei w dann eben der RGB Vektor für die Gewichtung der Farbkanläle wäre.

Ich dachte, glBlendColor setzt einfach eine konstante Destination-Color. Muss das nochmal ansehen :) Danke schonmal!

EDIT: Hat funktioniert :up: