2013-07-01 5 views
11

मैं शेडर्स का उपयोग करने वाले ओपनजीएल एप्लिकेशन के स्रोत को देख रहा हूं। एक विशेष शेडर इस तरह दिखता है:जीएलएसएल शेडर्स में निरंतर फ्लोट वैल्यू - वर्दी का उपयोग करने का कोई कारण?

uniform float someConstantValue; 
void main() 
{ 
    // Use someConstantValue 
} 

वर्दी कोड से एक बार सेट की जाती है और पूरे एप्लिकेशन रन-टाइम में कभी भी बदलाव नहीं होती है।

किस मामले में मैं someConstantValue को uniform के रूप में घोषित करना चाहता हूं और const float के रूप में नहीं?

संपादित करें: बस स्पष्ट करने के लिए, निरंतर मान एक भौतिक स्थिरता है।

उत्तर

7

सबसे पहले, वर्दी या स्थिर का उपयोग करने के बीच प्रदर्शन अंतर शायद नगण्य है। दूसरा, सिर्फ इसलिए कि प्रकृति में हमेशा मूल्य स्थिर रहता है इसका मतलब यह नहीं है कि आप हमेशा अपने कार्यक्रम में स्थिर रहना चाहते हैं। प्रोग्रामर अक्सर सर्वोत्तम दिखने वाले परिणाम का उत्पादन करने के लिए भौतिक मूल्यों को ट्विक करेंगे, भले ही यह वास्तविकता से मेल नहीं खाता हो। मिसाल के तौर पर, गुरुत्वाकर्षण के कारण त्वरण अक्सर कुछ प्रकार के खेलों में बढ़ जाता है ताकि उन्हें अधिक तेज गति से बनाया जा सके।

क्या आप GLSL में एक डिफ़ॉल्ट मान प्रदान कर सकता है अपने कोड में वर्दी सेट करने के लिए नहीं करना चाहते हैं:

uniform float someConstantValue = 12.5; 

यानी, अनुकरणीय की तरह कुछ के लिए स्थिरांक का उपयोग नहीं करने का कोई कारण नहीं है जहां इसे संशोधित करने में कम मूल्य होगा ....

+3

"वर्दी या निरंतर उपयोग के बीच प्रदर्शन अंतर ** शायद ** नगण्य है" अनुमान लगाना अच्छा नहीं है। निरंतर मूल्य घोषित करने से जीएलएसएल कंपाइलर ऑप्टिमाइज़ेशन करने की अनुमति देता है जो अन्यथा संभव नहीं होगा। लेकिन दुख की बात है कि जीएलएसएल कंपाइलर्स में बग्स हैं और अप्रत्याशित तरीकों से व्यवहार करते हैं। तो एक सामान्य जवाब वास्तव में संभव नहीं है। मुझे कॉन्स और गैर-कॉन्स एरे (उनकी लंबाई के आधार पर) का उपयोग करने के बीच गंभीर प्रदर्शन अंतर का सामना करना पड़ा है, भले ही उनके मूल्य को कभी भी संशोधित नहीं किया जाएगा। मुझे लगता है कि यह एक कंपाइलर बग है। – Tara

+0

हालांकि पिछली टिप्पणी उस समय सटीक थी, इस तरह के समय-समय पर संकलन की उम्मीद की जा सकती है। समान मूल्यों को अनुकूलित किया जा सकता है जैसे कि वे स्थिर थे। अधिक जानकारी के लिए [यह] देखें (https://www.khronos.org/opengl/wiki/Core_Language_ (GLSL) #Dynamically_uniform_expression)। –

1

मैं दो कारणों के बारे में सोच सकते हैं:

  1. डेवलपर कई अनुप्रयोगों में shaders का एक पुस्तकालय पुनः उपयोग कर लेता। तो प्रत्येक ऐप के लिए प्रत्येक शेडर को अनुकूलित करने के बजाय, डेवलपर उन्हें सामान्य रखने की कोशिश करता है।

  2. डेवलपर का अनुमान है कि यह चर बाद में उपयोगकर्ता द्वारा नियंत्रित सेटिंग होगी। तो इसे वर्दी के रूप में घोषित करना आगामी आने वाली सुविधा के लिए तैयारी है।

अगर मैं डेवलपर और उपरोक्त में से कोई था लागू होता है तो मैं के रूप में "स्थिरांक" यह घोषणा करेंगे के बजाय, क्योंकि यह एक प्रदर्शन लाभ दे सकते हैं और मैं अपने कोड से वर्दी स्थापित करने के लिए नहीं होगा।

15

विशाल कारण:

Error: Loop index cannot be compared with non-constant expression.

अगर मैं का उपयोग करें:

uniform float myfloat; 
... 
for (float i = 0.0; i < myfloat; i++) 

मैं एक त्रुटि क्योंकि myfloat एक constant expression नहीं है मिलता है।


हालांकि इस पूरी तरह से वैध है:

const float myfloat = 10.0; 
... 
for (float i = 0.0; i < myfloat; i++) 

क्यों?

When GLSL (and HLSL for that matter) are compiled to GPU assembly instructions, loops are unrolled in a very verbose (yet optimized using jumps, etc) way. Meaning the myfloat value is used during compile time to unroll the loop; if that value is a uniform (ie. can change each render call) then that loop cannot be unrolled until run time (and GPUs don't do that kind of JustInTime compilation, at least not in WebGL).

+1

ये मामले बहुत दुर्लभ हैं, और कुछ भी (और कुछ कंकाल एनीमेशन सिस्टम) की तुलना में गणना शेडरों में पॉप अप करते हैं। –

+1

इन दिनों, आप आधुनिक ओपनजीएल और डी 3 डी को समान मूल्यों के लिए समय-समय पर संकलन करने की उम्मीद कर सकते हैं (कोई भी मान जो * एक * रेंडर कॉल की अवधि के लिए नहीं बदला जाता है)। उदाहरण के लिए, एक बॉलियन वर्दी वैरिएबल की जांच करने पर एक कथन कंट्रोल किया जाएगा जब रेंडर कॉल शुरू किया जाएगा - GPU पर कोई रनटाइम चेक नहीं किया जाएगा। अधिक जानकारी के लिए [यह विकी] देखें (https://www.khronos.org/opengl/wiki/Core_Language_ (GLSL) #Dynamically_uniform_expression)। –

+0

यह सवाल के विपरीत जवाब दे रहा है - ओपी जानना चाहता है कि आप एक कॉन्स के बजाय वर्दी का उपयोग क्यों करेंगे, न कि दूसरी तरफ। – Karu

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