Tôi đã có trước đây đã là vấn đề mà tôi muốn để pha trộn các giá trị màu trong một đơn vị hình ảnh bằng cách làm một cái gì đó như:GLSL, semaphores?
vec4 texelCol = imageLoad(myImage, myTexel);
imageStore(myImage, myTexel, texelCol+newCol);
Trong một kịch bản mà nhiều mảnh vỡ có thể có cùng giá trị cho 'myTexel', điều này aparently là không thể bởi vì người ta không thể tạo ra nguyên tử giữa các lệnh imageLoad và imageStore và các shaderinvocations khác có thể thay đổi màu texel ở giữa.
Bây giờ ai đó đã nói với tôi rằng nhà thơ đang làm việc vất vả vấn đề này bằng cách tạo ra các semaphores bằng cách sử dụng các nguyên tử nguyên tử trên kết cấu uint, như vậy trình đổ bóng sẽ chờ đợi bằng cách nào đó trong một vòng lặp trước khi truy cập vào Texel và ngay sau khi nó miễn phí viết itno kết cấu số nguyên để chặn các lời gọi đổ bóng khác, xử lý màu texel và khi hoàn thành nguyên tử miễn phí số nguyên texel một lần nữa.
Nhưng tôi không thể có được bộ não của tôi arround như thế nào điều này thực sự có thể làm việc và làm thế nào mã như vậy sẽ như thế nào?
Thực sự có thể thực hiện việc này không? có thể đặt trình đổ bóng đoạn GLSL để đợi trong một vòng lặp while? Nếu có thể, ai đó có thể đưa ra một ví dụ?
Từ [đặc tả mở rộng] (http://www.opengl.org/registry/specs/EXT/shader_image_load_store.txt) có vẻ như bạn sẽ cần sắp xếp các rào cản bộ nhớ phù hợp, hoặc với 'MemoryBarrierEXT()' hoặc 'memoryBarrier()' trong chính trình tự đổ bóng. – Flexo
@awoodland: Các rào cản bộ nhớ không thể cho phép các trình đổ bóng khác chạy ở cùng một giai đoạn để đọc bộ nhớ. –
Xem câu trả lời của tôi cho http://stackoverflow.com/a/16802075/1388799 cho giải pháp hiện đang hoạt động đối với vấn đề semaphore GLSL trên thẻ Nvidia Kepler. –