2012-04-11 11 views
1

Mit Bild Laden und Speichern, würde Ich mag die folgende in GLSL 4.2 tun:GLSL 4.2 Bild Lade- und Speicher & Memory

vec3 someColor = ...; 
vec4 currentPixel = imageLoad(myImage, uv); 
float a = currentPixel.a/(currentPixel.a+1.0f); 
vec4 newPixel = vec4(currentPixel.rgb*a+someColor*(1.0f-a),currentPixel.a+1.0f); 
imageStore(myImage, uv, newPixel); 

der Wert für ‚uv‘ gleich für mehrere gerasterte Pixel betragen. Um das richtige Ergebnis zu erhalten, möchte ich natürlich keine andere Schattendarstellung in mein Pixel zwischen den Aufrufen von imageLoad() und imageStore() schreiben;

Ist das irgendwie mit MemoryBarrier möglich? Wenn ja, wie muss es in diesem Code verwendet werden?

Antwort

2

Der Wert für 'uv' kann für mehrere gerasterte Pixel gleich sein.

Dann können Sie es nicht tun.

memoryBarrier ist keine Möglichkeit, eine atomare Operation zu erstellen. Es nur garantiert die Bestellung für einen einzelnen Shader-Betrieb. Wenn also ein bestimmter Shaderaufruf ein Bild liest, schreibt und dann erneut liest, benötigen Sie eine memoryBarrier, um sicherzustellen, dass das, was gelesen wird, das ist, was vorher geschrieben wurde. Wenn ein anderer anderer Shaderaufruf ihm geschrieben hat, dann hast du kein Glück (außer es war ein abhängiger Aufruf. Die Regeln für dieses Zeug sind komplex).

Wenn Sie versuchen, eine programmatische Überblendung durchzuführen, müssen Sie sicherstellen, dass jeder Aufruf des Fragment-Shaders einen eindeutigen Wert liest/schreibt. Sonst wird es nicht funktionieren.

Sie sagen nicht, was Sie eigentlich erreichen möchten, also ist es nicht möglich, einen besseren Weg zu bekommen, was Sie wollen. Alles, was ich sagen kann ist, dass dieser Weg wird nicht funktionieren.

+0

in Ordnung - schon so thoght. vielen Dank für die Aufklärung. ja ich versuche zu mischen. Ich könnte ImageAtomicAdd (.., vec4 (someColor, 1.0f)) und beim Lesen der Pixel durch ihre .a-Wert teilen - aber das Problem ist, dass die Pixel anfangs bereits eine Farbe sowie ein Gewicht haben, und dieses Gewicht ist irgendwo zwischen 0 und 1 – user1282931

+0

@ user1282931: Wenn Sie versuchen, Blending zu tun, warum haben Sie mehrere Fragmente auf den gleichen Wert schreiben? –

+0

ist es eine Art Rückprojektion auf eine Reflexionskarte. die gerenderte Reflexion ist ebenso vorhanden wie die Objektnormale perpixel und daraus sollte eine Reflektionskarte erstellt werden - so können mehrere Fragmente auf das gleiche Reflektions-Texel abgebildet werden und um Rauschen zu vermeiden, möchte ich Blending verwenden – user1282931

0

Sie müssten ein Schließsystem (lock/mutex) implementieren. Für diesen Zweck ist es gut, imageAtomicCompSwap zu verwenden, oder wenn Puffer verwendet wird, atomicCompSwap. Natürlich müssten Sie globale Variable (sagen Textur) nicht lokale verwenden.

Zur Umsetzung Zweck, ich glaube, diese Frage zu Ihrem Problem in großem Teil Antwort lautet: Is my spin lock implementation correct and optimal?