इसके अलावा, हमारे पास एक पूर्वनिर्धारित gl_FragColor है।
इससे शुरुआत करते हैं। नहीं, आपके पास पूर्वनिर्धारित नहीं है gl_FragColor
। कि कोर OpenGL 3.1 और ऊपर से हटा दिया गया था। जब तक आप संगतता का उपयोग नहीं कर रहे हैं (किस स्थिति में, आपके 3.30 शेडर्स को #version 330 compatibility
शीर्ष पर कहना चाहिए ), आपको इसका उपयोग कभी नहीं करना चाहिए।
अब, उपयोगकर्ता-परिभाषित टुकड़ा shader आउटपुट पर वापस। लेकिन पहले, एक त्वरित सादृश्य।
याद रखें कि कैसे, शीर्ष क्रम में, आपके पास इनपुट हैं? और ये इनपुट वर्टेक्स विशेषता सूचकांकों का प्रतिनिधित्व करते हैं, जिन संख्याओं को आप पास करते हैं glVertexAttribPointer
और glEnableVertexAttribArray
आगे? आप सेट करते हैं कि कौन सा इनपुट किस विशेषता से खींचता है। GLSL 3.30 में, आप इस सिंटैक्स का उपयोग करते हैं:
layout(location = 2) in color;
यह color
विशेषता स्थान 2 से आने के लिए शीर्ष shader इनपुट सेट करता है । 3.30 से पहले (या ARB_explicit_attrib_location के बिना), आपको glBindAttrbLocation
विशेषता सूचकांक के लिए प्रोग्राम को लिंक करने या क्वेरी करने से पहले इसे या तो स्पष्ट रूप से सेट करना होगा glGetAttribLocation
। यदि आप स्पष्ट रूप से एक विशेषता स्थान प्रदान नहीं करते हैं, तो GLSL एक स्थान को मनमाने ढंग से निर्दिष्ट करेगा (यानी: कार्यान्वयन-परिभाषित तरीके से)।
इसे shader में सेट करना लगभग हमेशा बेहतर विकल्प होता है।
किसी भी मामले में, टुकड़ा shader outputs लगभग उसी तरह काम करते हैं। फ्रेग्मेंट शेड्स कई आउटपुट रंगों को लिख सकते हैं , जो स्वयं मैप किए जाते हैं फ्रेमबफ़र में कई बफ़र्स के । इसलिए, आपको यह इंगित करने की आवश्यकता है कि कौन सा आउटपुट किस टुकड़े में जाता है आउटपुट रंग।
यह प्रक्रिया खंड आउटपुट स्थान मान से शुरू होती है। यह बहुत समान रूप से शेल्टर इनपुट स्थानों पर सेट है:
layout(location = 1) out secColor;
वहाँ भी एपीआई कार्य कर रहे हैं glBindFragDataLocation
और glGetFragDataLocation
, जो अनुरूप हैं glBindAttribLocation
औरglGetAttribLocation
।
यदि आप कोई स्पष्ट कार्य नहीं करते हैं, तो कार्यान्वयन आमतौर पर आपके आउटपुट चर में से एक को स्थान 0 पर निर्दिष्ट करेगा। हालांकि, OpenGL प्रक्रिया नहीं करती है इस व्यवहार की आवश्यकता है , इसलिए आपको इस पर निर्भर नहीं होना चाहिए।
अब निष्पक्ष होने के लिए, आपके प्रोग्राम को लिंक करने में विफल होना चाहिए जब आपने दो आउटपुट का उपयोग किया था जो अलग-अलग आउटपुट स्थान नहीं मिला। संभवतः ऐसा क्या हुआ था कि आपके कंपाइलर ने आपके द्वारा लिखे गए को अनुकूलित नहीं किया था, इसलिए जब यह लिंकर त्रुटियों की जांच करने का समय आया तो वह इसके बारे में भूल गया।