2013-09-25 7 views
8

के बारे में भ्रम तो मैं नारंगी पुस्तक (तीसरा संस्करण) के माध्यम से जा रहा था और मैं आविष्कार क्वालीफायर के बारे में अध्याय 9 में एक पारित हुआ। और यह कहते हैं:ओपनजीएल इनवेरिएंट क्वालीफायर

अपरिवर्तनीय क्वालीफायर संकलक निर्देश देता है और अभिव्यक्ति और कार्यों कि सीधे उत्पादन की गणना से संबंधित नहीं हैं की अनदेखी करने के लिए जोड़ा।

uniform mat4 MVPmatrix; 
// ... 

in vec4 MCVertex; 
// ... 

a(); // does not modify gl_Position, MVP or MCVertex 

// ... 
// Transform vertex to clip space 
gl_Position = MVP * MCVertex; 

और

uniform mat4 MVPmatrix; 
// ... 

invariant gl_Position; 
in vec4 MCVertex; 
// ... 

a(); // does not modify gl_Position, MVP or MCVertex 

// ... 
// Transform vertex to clip space 
gl_Position = MVP * MCVertex; 

किताब तो राज्य पर चला जाता है:

पहला मामला हो सकता है या

यह अंश कोड के दो समान के टुकड़े के बाद आता है परिवर्तित स्थिति को उसी तरह से गणना नहीं कर सकता है इससे कोई फर्क नहीं पड़ता कि असंबद्ध कार्य क्या है या अभिव्यक्ति शेडर से जुड़ा हुआ है। यह प्रतिपादन में समस्याएं पैदा कर सकता है यदि एक मल्टीपास एल्गोरिदम का उपयोग उसी ज्यामिति को एक से अधिक बार प्रस्तुत करने के लिए किया जाता है।

जो मुझे उलझन में डाल दिया है। यदि a() किसी भी तरह से परिवर्तित स्थिति की गणना करने में शामिल चर को प्रभावित नहीं करता है, तो गणना कैसे भिन्न होगी? (और invariant जोड़कर वास्तव में कैसे मदद करता है?)। और पहले उद्धरण का जिक्र करते हुए, "असंबद्ध कार्यों को अनदेखा करके" उनका क्या अर्थ है? क्या वे अभी निष्पादित नहीं हुए हैं?

उत्तर

8

invariant का उद्देश्य यह सुनिश्चित करना है कि आप जो गणना कर रहे हैं, उसका परिणाम हमेशा एक ही परिणाम होगा, इससे कोई फर्क नहीं पड़ता कि शेडर अनुकूलक शेडर को क्या करेगा (विशेष रूप से एकाधिक शेडर संकलनों में)।

मुझे नारंगी पुस्तक का वाक्यांश खराब होना चाहिए (और भ्रामक, जैसा कि आपने नोट किया है)। GLSL विनिर्देश (भाषा 1.2) खंड 4.6 बहुत स्पष्ट है:

इस खंड में, विचरण अलग अलग कार्यक्रमों में एक ही अभिव्यक्ति से विभिन्न मूल्यों हो रही की संभावना को दर्शाता है। उदाहरण के लिए, विभिन्न प्रोग्रामों में दो वर्टेक्स शेडर्स कहें, प्रत्येक शेडर में एक ही अभिव्यक्ति के साथ gl_Position सेट करें, और उस अभिव्यक्ति में इनपुट मान समान हैं जब दोनों शेडर्स चलते हैं। यह संभव है, दो शेडरों के स्वतंत्र संकलन के कारण, gl_Position को आवंटित मान बिल्कुल समान नहीं हैं जब दो शेडर्स चलते हैं। इस उदाहरण में, यह बहु-पास एल्गोरिदम में ज्यामिति के संरेखण के साथ समस्याएं पैदा कर सकता है। आम तौर पर, शेडर के बीच के बीच इस तरह की भिन्नता की अनुमति है। जब विशेष आउटपुट वैरिएबल के लिए ऐसा भिन्नता मौजूद नहीं है, तो उस चर को परिवर्तनीय कहा जाता है।

और यह समझाता है कि invariant क्वालीफायर आपको इस मुद्दे से बचने के लिए गारंटी देता है।

+0

मुझे नहीं लगता कि यह मूल दो प्रश्नों का उत्तर देता है। और उद्धरण ब्लॉक न तो – suitianshi

+0

@ सुइटियानशी: ओपी invariant को समझना चाहता था, और नारंगी पुस्तक के बारे में क्या कहना था विच्छेदन करने के लिए चला गया। नारंगी पुस्तक सामग्री अनिवार्य रूप से गलत माना जा सकता है। इसलिए मैंने मूल स्रोत, जीएलएसएल स्पेक से जवाब देने के लिए चुना। मूल प्रश्न गलत बयान को समझने की कोशिश कर रहे हैं। आप क्या सही जवाब चाहते हैं? – Bahbar

+0

मुझे एक पृष्ठ मिला जो बताता है कि हमें कभी-कभी "invariant" की आवश्यकता क्यों होगी। यह कहता है कि मल्टी-पास समस्या सीपीयू निर्देशों के पुनरावृत्ति के कारण हो सकती है (और कुछ और, क्षमा करें कि मुझे यह स्पष्ट नहीं है और सामग्री को फिर से नहीं मिल सकता है)। उदाहरण के लिए, यदि मैं एक ही शेडर प्रोग्राम के साथ दो बार त्रिकोण प्रदान करता हूं लेकिन दो पास के दौरान मुझे नींद आती है या खरीदारी होती है, तो परिणामी दो त्रिकोण ओवरलैप नहीं हो सकते हैं (बेशक, ऑफसेट वास्तव में छोटा हो सकता है)। असल में मैंने जीएलएसएल स्पेक पढ़ा है, लेकिन अभी भी उलझन में है। – suitianshi

3

invariant कीवर्ड, (संक्षेप में और बहबार के अधिक विस्तृत उत्तर के विपरीत) बहुत सूक्ष्म कम्प्यूटेशनल मतभेदों के बारे में अधिक है, जैसा कि आपने उल्लेख किया है, कई ज्यामिति पास हैं।

यहां एक उदाहरण दिया गया है: आप एक मनमानी, अजीब (इसे कठिन बनाने के लिए) स्क्रीन पर त्रिकोण खींचते हैं। रास्टराइज़र सामान्यीकृत शिखर प्राप्त करता है और यह उन सभी टुकड़ों की गणना करता है जो यह कब्जा करते हैं, फिर उस पर एक टुकड़ा शेडर चलाते हैं। अब, कल्पना करें कि आप इसके ठीक ऊपर एक और त्रिकोण बनाना चाहते हैं, लेकिन 3 घंटे बाद, जबकि आपका पीसी डूबा हुआ है, तापमान गिरता है और आप इस दौरान एक लंच खाते हैं। आप तब शेडर्स को फिर से कंपाइल करते हैं, और बाम ...

उन सभी संभावित रूप से रास्टरराइज़र को प्रभावित कर सकते हैं। शेडर ऑप्टिमाइज़ेशन आउटपुट में कमजोर परिवर्तन कर सकते हैं और कर सकते हैं। जबकि अभी भी तकनीकी रूप से सही है, परिणाम आवश्यक रूप से पहले त्रिकोण के समान नहीं होना चाहिए, और "समस्याएं" पहले बाएं से कुछ पिक्सेल होगी।

invariant सुनिश्चित करता है कि संभावित रूप से धीमा दृष्टिकोण लिया जाता है। मैं एक चालक वास्तुकार नहीं हूं, आपको याद है, लेकिन आम तौर पर इसका अर्थ कुछ अतिरिक्त राज्य रीसेट, क्लीनअप, या कभी-कभी राज्य स्टैक पुश/पॉप का मतलब हो सकता है। केवल तब ही आपको "साफ" कम्प्यूटेशनल स्थिति के साथ छोड़ दिया जाता है, और जब तक आपका हार्डवेयर ठीक है, परिणाम बिल्कुल वही होना चाहिए।

संबंधित मुद्दे