मैं पहले पहले से ही समस्या यह है कि मैं की तरह कुछ कर रही द्वारा एक छवि इकाई में रंग मान मिश्रण करने के लिए करना चाहता था हो रही थी:जीएलएसएल, सेमफोर?
vec4 texelCol = imageLoad(myImage, myTexel);
imageStore(myImage, myTexel, texelCol+newCol);
परिदृश्य में कई टुकड़े 'myTexel' के लिए एक ही मूल्य है सकते हैं, जहां, इस aparently संभव नहीं है क्योंकि कोई छवि लोड और छवि के बीच परमाणुता नहीं बना सकता हैस्टोर कमांड और अन्य shaderinvocations texel रंग को बीच में बदल सकता है।
अब किसी ने मुझसे कहा कि poeple, uint बनावट पर परमाणु comands का उपयोग कर, ऐसी है कि शेडर Texel एक्सेस करने से पहले थोड़ी देर के पाश में किसी भी तरह इंतजार करेंगे और जैसे ही यह नि: शुल्क है संकेतबाहु बनाने के द्वारा इस समस्या को arround काम कर रहे हैं atomically अन्य टुकड़े शेडर आमंत्रणों को अवरुद्ध करने के लिए पूर्णांक बनावट लिखें, रंगीन पाठ को संसाधित करें और जब पूर्ण रूप से पूर्णांक पूर्णांक को समाप्त कर दें।
लेकिन मैं अपने दिमाग को इस बात पर नहीं देख सकता कि यह वास्तव में कैसे काम कर सकता है और यह कोड कैसा दिखता है?
क्या यह वास्तव में ऐसा करना संभव है? क्या एक जीएलएसएल टुकड़ा शेडर थोड़ी देर में प्रतीक्षा करने के लिए सेट किया जा सकता है? यदि यह संभव है, तो क्या कोई उदाहरण दे सकता है?
[विस्तार विनिर्देश] से (http://www.opengl.org/registry/specs/EXT/shader_image_load_store.txt) ऐसा लगता है कि आपको उचित मेमोरी बाधाओं की व्यवस्था करने की आवश्यकता होगी, या तो 'मेमोरीबैरिएरएक्सटीटी) ('' या खुद को शेडर्स में 'मेमोरीबैरियर()'। – Flexo
@awoodland: मेमोरी बाधाएं स्मृति को पढ़ने के लिए एक ही चरण में चल रहे अन्य शेडरों को अनुमति नहीं दे सकती हैं। –
एनवीडिया केप्लर कार्ड पर जीएलएसएल सेमफोर समस्या के वर्तमान में काम करने वाले समाधान के लिए http://stackoverflow.com/a/16802075/1388799 पर मेरा उत्तर देखें। –