miałem wcześniej już problem, który chciałem mieszanka wartości kolorów w jednostce obrazu wykonując coś takiego:GLSL, semafory?
vec4 texelCol = imageLoad(myImage, myTexel);
imageStore(myImage, myTexel, texelCol+newCol);
W scenariuszu, w którym wiele fragmenty mogą mieć taką samą wartość dla „myTexel”, to aparently nie jest możliwe, ponieważ nie można utworzyć atomowości między poleceniami imageLoad i imageStore, a inne wywołania shaderinokacji mogą zmienić kolor texel pomiędzy.
Teraz ktoś mi powiedział, że ludzie pracują nad całym tym problemem, tworząc semafory za pomocą komend atomowych na teksturach uint, tak, że shader czekał jakoś w pętli przed uzyskaniem dostępu do teksela i jak tylko jest wolny, atomowo zapisz itno teksturę całkowitą, aby zablokować inwokacje innych fragmentów cieniowania, przetwórz kolor texel i po zakończeniu atomowo całkowicie zwolnij liczbę całkowitą texel.
Ale nie rozumiem, jak to działa i jak taki kod mógłby wyglądać?
Czy to naprawdę możliwe? czy moduł cieniujący GLSL można ustawić tak, aby odczekał chwilę? Jeśli to możliwe, czy ktoś może dać przykład?
Od [specyfikacja rozszerzenia] (http://www.opengl.org/registry/specs/EXT/shader_image_load_store.txt) wygląda na to, że musisz ustawić odpowiednie bariery pamięci, używając opcji 'MemoryBarrierEXT()' lub 'memoryBarrier()' w samych modułach cieniujących. – Flexo
@awoodland: Bariery pamięci nie pozwalają innym programom cieniującym działającym na tym samym etapie odczytać pamięć. –
Zobacz moją odpowiedź na http://stackoverflow.com/a/16802075/1388799 dla aktualnie działającego rozwiązania problemu semaforów GLSL na kartach Nvidia Kepler. –