2016-05-10 3 views
1

Ich habe eine Anwendung, in der ich texturierte Puffer verwende mit glBindImageTexture, und meine GLSL-Code macht verschiedene Dinge und aktualisiert die Puffer.imageAtomic GLSL-Funktionen und RGBA-Bildformat

Kürzlich habe ich einige meiner Bildpufferformate von GL_R32UI in GL_RGBA32UI geändert. Im Grunde war ein Texel 1 unsigned int vorher und jetzt sind es 4 unsigned ints. Bei ImageStores, imageLoads und clientseitigen Dingen funktioniert alles einwandfrei.

Ich bekomme derzeit ein paar Probleme bei der Verwendung von imageAtomic * -Funktionen. Nehmen wir imageAtomicAdd. Der letzte Parameter hat immer eine Ganzzahl, unabhängig vom Pufferformat. Z.B. Es ist kein uvec4 und bleibt eine einzige Uint. Wenn ich imageAtomicAdd (some_uimageBuffer, some_address, 1u) aufruft, was soll genau passieren? Wird GLSL alle 4 Texel-Komponenten (x, y, z und w) oder nur eins inkrementieren? Welcher?

Vielen Dank für Ihre Einsicht!

Antwort

2

Wird GLSL alle 4 Texel-Komponenten (x, y, z und w) oder nur eins inkrementieren? Welcher?

Weder; es ist einfach nicht erlaubt. Von der Spezifikation:

Atomspeicheroperationen werden nur für eine Teilmenge aller Bildvariablentypen unterstützt; Bild entweder sein:

  • eine vorzeichenbehaftete Ganzzahl Bildgröße (Typ beginnt „iimage“), und ein Format, Qualifier von r32i, mit einem Datum Argumente vom Typ verwendeten int oder
  • eine unsignierte Bildgröße (Typ beginnt "Uimage") und ein Formatqualifikationsmerkmal von r32ui, das mit einem Datenargument des Typs uint verwendet wird.
+0

Vielen Dank! Kein Wunder, dass mein Code völlig falsch ist. SSBO scheint der richtige Weg zu sein, wenn ich auf Vec4-Basis zugreifen und vec4 einzelne Komponenten atomar verändern möchte. Wird das überprüfen. –

+0

@MartinFrank: Sie sollten [die GLSL-Spezifikation lesen] (https://www.opengl.org/registry/), bevor Sie solche Aussagen machen. Weil die SSBO-Atomoperationen nicht auf Vektoren * entweder * wirken. Sie können * SIMD atomare Operationen nicht ausführen. –

+0

Sie können auf einzelne Vektorkomponenten reagieren, wenn ich dieser OpenGL-Website-Seite vertraue: [link] (https://www.opengl.org/wiki/Shader_Storage_Buffer_Object). Abschnitt "Atomic Operations": Zitat: "_Diese arbeiten nur auf Uint- oder Int-Typen, aber diese können Mitglieder von Aggregaten (Structs/Arrays) ** oder Vektorelementen sein (dh: Sie können auf uvec3.x atomar zugreifen **) _ ". Sagen Sie, dass diese Webseite falsch ist? –

Verwandte Themen