Hey zusammen,
vielleicht eine etwas ungewöhnliche Frage.
Ich versuche derzeit ausgewählte Informationen aus meinen Shadern zu bekommen (gerna auch mit GLSL 4.4). Angenommen ich habe 512x512 Shader Aufrufe welche fröhlich nen Integer berechnen. Jetzt will ich davon beispielsweise 100 Integer (nach irgendeinem Auswahlkriterium) in einen Shader Storage Buffer schreiben (Ähnliche Funktionalität wie eine Liste mit .add(x))
Da kommen auf mich gleich mehrere Probleme zu:
1) Synchronisation, dass sich die Shader nicht gegenseitig irgendwas überschreiben. So wie ich die atomaren Funktionen wie atomicAdd verstanden habe bringen die mir hier nicht viel.
2) Den Index des Buffers berechnen. Dies wäre vmtl leicht über einen atomicCounter zu lösen.
Vielleicht ein kleines Beispiel damit ihr wisst was ich meine:
Gegeben seien 4 Shader Aufrufe S_i und der Buffer B
S_2 berechnet integer 4 -> nicht abspeichern
S_1 berechnet integer 5 -> abspeichern: B{5}
S_3 berechnet integer 8 -> abspeichern: B{5,8}
S_4 berechnet integer 3 -> nicht abspeichern
Ist eine solche Funktionalität in OpenGL / GLSL überhaupt möglich? Wenn ja habt ihr eine Idee wie man das angehen könnte?
Grüße
EDIT:
Eine Alternative wäre es den Buffer wie gewohnt zu befüllen und dann nach einem Kriterium in einem Shader zu sortieren.
Allerdings ist Sortieren auf GPUs recht langsam und aufwändig. Wenn ich von einem Buffer mit 512² Elementen nur die 3 kleinsten Einträge möchte ist das Sortieren ein wenig overkill