2012-11-24 34 views
15

The OpenGL docs for glUseProgram दावा करते हैं कि शून्य के तर्क के साथ इसे कॉल करने से शेडर निष्पादन के परिणाम undefined हो जाएंगे।क्या glUseProgram (0) क्या करता है?

हालांकि, थोड़ी सी खोज के बाद मैंने glUseProgram से का उपयोग कर लोगों के कुछ उदाहरणों को देखा है, वर्तमान शेडर प्रोग्राम अनइंस्टॉल करें।

इस व्यवहार विश्वसनीय है? यदि नहीं, तो glUseProgram(0) वास्तव में क्या करता है?

उत्तर

20

glUseProgram का अर्थ है कि दिया गया प्रोग्राम ऑब्जेक्ट वर्तमान प्रोग्राम है जिसका उपयोग प्रोग्रामों (glUniform, आदेशों को प्रतिपादित करने आदि) के लिए उपयोग किया जाएगा। 0 OpenGL ऑब्जेक्ट्स के लिए NULL जैसा बहुत कुछ है। यह not an object (अधिकांश वस्तुओं के लिए) का प्रतिनिधित्व करता है। इसलिए, glUseProgram का अर्थ है कि कोई प्रोग्राम चालू है, और इसलिए प्रोग्राम का उपयोग करने वाली चीज़ों के लिए कोई प्रोग्राम उपयोग नहीं किया जाएगा।

आप glUniform कार्यों कॉल करने के लिए जब कोई कार्यक्रम वर्तमान है प्रयास करते हैं, वे एक त्रुटि के साथ विफल हो जाएगा। यदि आप कोई प्रोग्राम चालू नहीं करते हैं तो प्रस्तुत करने का प्रयास करते हैं, तो दो चीजों में से एक होगा।

  • में ओपन 3.1+, कोर प्रोफ़ाइल, आप एक GL_INVALID_OPERATION त्रुटि, मिलता है क्योंकि कोर ओपन एक कार्यक्रम के साथ प्रस्तुत करना चाहिए होगा।
  • अनुकूलता प्रोफाइल या संस्करण 3.0 या उससे कम में, आप करेंगे अचल समारोह प्रतिपादन मिलता है।
+0

तो दूसरे शब्दों में मुझे सिर्फ 'glUseProgram (0)' कॉल नहीं करना चाहिए? – user11171

+6

@ user11171: नहीं। जब आप प्रोग्राम को बाध्य नहीं करना चाहते हैं तो आपको इसे कॉल करना चाहिए। ऐसा करके, आप गलती से ऐसे प्रोग्राम के साथ प्रतिपादन को रोकते हैं जिसका इरादा नहीं था (यानी: आप इच्छित प्रोग्राम के साथ 'ग्लूसेप्रोग्राम' को कॉल करना भूल गए थे)। जब आप रेंडरिंग समाप्त कर लेंगे तो आप आमतौर पर इसे कॉल करेंगे। –

2

यह ओपन बताता फिक्स्ड समारोह पाइप लाइन का उपयोग करें।

+1

ध्यान दें कि मूल प्रोफ़ाइल में, कोई फिक्स्ड-फ़ंक्शन पाइपलाइन नहीं है, इसलिए आपको केवल एक ओपनजीएल त्रुटि ('GL_INVALID_OPERATION') –

+0

----- नोटेड ----- – Aaron

+0

या कुछ मशीनों पर, एक segfault। – SystemParadox

3

यहां और अन्य जगहों के बहुत सारे उत्तरों के विपरीत, glUseProgram (0) सुरक्षित नहीं है। आप प्रतिपादन स्थिति को किसी अमान्य प्रोग्राम ऑब्जेक्ट पर सेट करने के लिए इसका उपयोग कर सकते हैं, लेकिन यदि प्रतिपादन होने पर यह अभी भी बाध्य है, तो व्यवहार अपरिभाषित है।

यह गलती से गलत प्रोग्राम का उपयोग करने से बचने में मदद के लिए उपयोगी हो सकता है, लेकिन आपको इसका उपयोग "फिक्स्ड-फ़ंक्शन मोड का उपयोग" करने के लिए नहीं करना चाहिए। ज्यादातर मामलों में यह होता है, लेकिन यह spec द्वारा परिभाषित नहीं किया गया है और इस पर भरोसा नहीं किया जाना चाहिए।

से

doc:

"अगर कार्यक्रम शून्य है, तो मौजूदा प्रतिपादन राज्य एक अवैध कार्यक्रम वस्तु को संदर्भित करता है और शेडर निष्पादन के परिणामों undefined हैं" इसलिए

परिणाम ओएस, ड्राइवर और ग्राफिक्स कार्ड के लिए पूरी तरह से विशिष्ट हैं। कई मामलों में यह फिक्स्ड-फ़ंक्शन मोड पर वापस आता है। हालांकि, यह बस के रूप में आसानी से पिछले शेडर, रखने कचरा प्रस्तुत करना, या एक segfault कारण बन सकता है (मैंने देखा है ऐसा)।

+2

glUseProgram (0) पूरी तरह से सुरक्षित है। जैसा कि पृष्ठ कहता है, gluseProgram (0) को कॉल करने में कोई त्रुटि नहीं है; केवल कार्यक्रम के बिना कुछ भी प्रस्तुत करने के लिए। और यह केवल मूल प्रोफ़ाइल पर लागू होता है। – rdb

+0

यह उत्तर गलत है। rdp सही है। कॉलिंग "glUseProgram (0)" एक शेडर निष्पादन नहीं है। यदि आप "glUseProgram (0)" को कॉल करने के बाद प्रतिपादन करते हैं, तो यह एक शेडर निष्पादन है! – Tara

+0

@Dudeson, आप सही हैं। glUseProgram() शेडर निष्पादन का कारण नहीं बनता है, लेकिन जैसा कि spec कहता है, यह प्रतिपादन स्थिति को बदलता है ताकि किसी भी शेडर निष्पादन के परिणाम (जब आप बाद में ऐसा करने के लिए कुछ करते हैं) अपरिभाषित – SystemParadox

0

एक बार जब आप glUseProgram(myShader) का उपयोग कर रहे हैं तो सभी बाद के प्रतिपादन शेडर आईडी myShader का उपयोग करके किया जाएगा।

यदि आप इसे हर बार कॉल कर रहे हैं तो आपके पास modern openGL 3.1+ में कोई भौतिक परिवर्तन है, तो glUseProgram(0) का थोड़ा उपयोग नहीं है।

हालांकि, अगर आप glVertex3f(..) की तरह, वहाँ में कुछ निश्चित समारोह प्रतिपादन एकीकृत करने के लिए योजना बना रहे हैं, तो glUseProgram(0) सुनिश्चित करें कि पिछली बार उपयोग करने शेडर अब सक्रिय नहीं है कर देगा, और यह glColor3f(...) की तरह अचल समारोह पाइप लाइन का उपयोग करेगा,

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

  • कोई संबंधित समस्या नहीं^_^