एक दृष्टिकोण का एक गुच्छा है, लेकिन कोई भी सही नहीं है।
कोड glAttachShader
को मिलाते हुए उपयोग करके कोड साझा करना संभव है , लेकिन इससे संरचनात्मक घोषणाओं या #define
-d स्थिरांक जैसी चीजों को साझा करना संभव नहीं है। यह कार्यों को साझा करने के लिए काम करता है।
कुछ लोग glShaderSource
आपके कोड से पहले आम परिभाषाओं को प्रस्तुत करने के तरीके के रूप में पारित स्ट्रिंग्स के सरणी का उपयोग करना पसंद करते हैं , लेकिन इसके कुछ नुकसान हैं:
- यह नियंत्रित करना कठिन है कि शेडर के भीतर से क्या शामिल किया जाना चाहिए (इसके लिए आपको एक अलग सिस्टम की आवश्यकता है।)
- इसका अर्थ यह है कि shader लेखक GLSL
#version
में निम्नलिखित कथन के कारण GLSL को निर्दिष्ट नहीं कर सकता है :
#Version निर्देश, कुछ और करने से पहले एक शेडर में होने चाहिए टिप्पणियों और सफेद स्थान को छोड़कर।
इस कथन के कारण, घोषणाओं glShaderSource
से पहले पाठ को प्रस्तुत करने के लिए उपयोग नहीं किया जा सकता है #version
। इसका मतलब है कि #version
लाइन को आपके glShaderSource
तर्कों में शामिल करने की आवश्यकता है , जिसका अर्थ है कि आपके GLSL संकलक इंटरफ़ेस को किसी तरह से यह बताने की आवश्यकता है कि GLSL के किस संस्करण का उपयोग किए जाने की उम्मीद है। इसके अतिरिक्त, निर्दिष्ट नहीं करना #version
GLSL संस्करण 1.10 का उपयोग करने के लिए GLSL संकलक को डिफ़ॉल्ट बना देगा। यदि आप shader लेखकों #version
को स्क्रिप्ट को एक मानक तरीके से निर्दिष्ट करने देना चाहते हैं , तो आपको किसी तरह कथन के #include
बाद सम्मिलित करना होगा #version
। यह स्पष्ट रूप से #version
स्ट्रिंग को खोजने के लिए GLSL shader को पार्स करके किया जा सकता है (यदि वर्तमान में) और इसके बाद अपना समावेश करें, लेकिन इसमें एक्सेस होने के बाद#include
निर्देश आसानी से नियंत्रित करने के लिए बेहतर हो सकता है जब उन निष्कर्षों को बनाने की आवश्यकता होती है। दूसरी ओर, चूंकि जीएलएसएल #version
लाइन से पहले टिप्पणियों को अनदेखा करता है , आप अपनी फ़ाइल के शीर्ष पर टिप्पणियों के भीतर मेटाडेटा शामिल कर सकते हैं (yuck।)
अब सवाल यह है: क्या #include
आपके पास अपने पूर्वप्रोसेसर एक्सटेंशन को रोल करने के लिए एक मानक समाधान है या क्या आपको इसकी आवश्यकता है?
नहीं है GL_ARB_shading_language_include
विस्तार, लेकिन यह कुछ कमियां भी हैं:
- यह केवल NVIDIA ( http://delphigl.de/glcapsviewer/listreports2.php?listreportsbyextension=GL_ARB_shading_language_include ) द्वारा समर्थित है
- यह समय से पहले शामिल स्ट्रिंग्स को निर्दिष्ट करके काम करता है। इसलिए, संकलन करने से पहले, आपको यह निर्दिष्ट करने की आवश्यकता है कि स्ट्रिंग
"/buffers.glsl"
(जैसा कि उपयोग किया गया है #include "/buffers.glsl"
) फ़ाइल की सामग्री buffer.glsl
(जो आपने लोड की है ) से मेल खाती है ।
- जैसा कि आपने बिंदु (2) में देखा होगा, आपके रास्तों को
"/"
लिनक्स शैली के निरपेक्ष पथों के साथ शुरू करने की आवश्यकता है । यह संकेतन आमतौर पर सी प्रोग्रामर्स के लिए अपरिचित है, और इसका मतलब है कि आप सापेक्ष पथ निर्दिष्ट नहीं कर सकते।
एक सामान्य डिज़ाइन अपने स्वयं के #include
तंत्र को लागू करने के लिए है, लेकिन यह मुश्किल हो सकता है क्योंकि आपको #if
सशर्त संकलन (जैसे हेडर गार्ड्स) को ठीक से संभालने के लिए अन्य पूर्वप्रक्रमक निर्देशों को पार्स (और मूल्यांकन) करने की आवश्यकता है ।
यदि आप अपना स्वयं का कार्यान्वयन करते हैं #include
, तो आपके पास कुछ स्वतंत्रताएं हैं कि आप इसे कैसे लागू करना चाहते हैं:
- आप समय से पहले तार को पास कर सकते हैं (जैसे
GL_ARB_shading_language_include
)।
- आप इसमें शामिल कॉलबैक को निर्दिष्ट कर सकते हैं (यह डायरेक्टएक्स के डी 3 डी कम्पाइलर लाइब्रेरी द्वारा किया गया है।)
- आप एक ऐसी प्रणाली लागू कर सकते हैं जो हमेशा फाइलसिस्टम से सीधे पढ़ती है, जैसा कि विशिष्ट सी अनुप्रयोगों में किया जाता है।
सरलीकरण के रूप में, आप स्वचालित रूप से अपनी प्रीप्रोसेसिंग परत में शामिल प्रत्येक के लिए हेडर गार्ड को सम्मिलित कर सकते हैं, इसलिए आपके प्रोसेसर की परत इस तरह दिखती है:
if (#include and not_included_yet) include_file();
(मुझे उपरोक्त तकनीक दिखाने का श्रेय ट्रेंट रीड को दिया जाता है।)
निष्कर्ष में , कोई स्वचालित, मानक और सरल समाधान मौजूद नहीं है। भविष्य के समाधान में, आप कुछ SPIR-V OpenGL इंटरफ़ेस का उपयोग कर सकते हैं, जिस स्थिति में GLSL से SPIR-V संकलक GL API से बाहर हो सकते हैं। OpenGL रनटाइम के बाहर कंपाइलर होने से चीजों को लागू करने में बहुत आसानी होती है #include
क्योंकि यह फाइलसिस्टम के साथ इंटरफेस करने के लिए अधिक उपयुक्त स्थान है। मेरा मानना है कि मौजूदा व्यापक विधि सिर्फ एक कस्टम प्रीप्रोसेसर को लागू करना है जो किसी भी सी प्रोग्रामर से परिचित होना चाहिए।