2011-08-02 12 views
5

GLSL के बाद से एक में शामिल फ़ाइल विकल्प नहीं है मैं एक "#pragma में शामिल हैं" पार्सर का उपयोग करके इस जोड़ने के लिए कोशिश कर रहा हूँ शामिल हैं। (मुझे यह चाहिए क्योंकि मेरे पास कुछ सामान्य तरीकों हैं जिन्हें मैं केवल एक बार लागू करना चाहता हूं लेकिन केन पर्लिन की चिकनी स्थिति जैसे कई अलग-अलग शेडर्स में उपयोग कर सकता हूं)ओपन/GLSL - कई स्रोत के साथ glShaderSource उपयोग करने का समर्थन करने के लिए फ़ाइलों

शामिल फ़ाइलों को प्राप्त करने के लिए शेडर फ़ाइलों को पार्स करना ठीक काम करता है। लेकिन एकाधिक स्रोत फ़ाइलों के साथ शेडरसोर्स सेट करते समय मैं हमेशा समस्याओं में भाग लेता हूं; चूंकि मेरा मुख्य शेडर आमतौर पर "#version 330" से शुरू होता है और # संस्करण-रेखा हमेशा शेडर में पहली पंक्ति होती है, मैं केवल अपनी मुख्य फ़ाइल को glShadersource को पारित तारों की सरणी में पहली बार जोड़ सकता हूं, और उसके बाद कि सभी शामिल फाइलें। लेकिन तब मेरी मुख्य फ़ाइल उन शामिल फ़ाइलों में लागू किसी भी कार्यों का उपयोग नहीं कर सकते, क्योंकि वे अनिवार्य रूप से अपने मुख्य फ़ाइल के बाद concatenated देंगे, इसलिए संकलक शिकायत है कि यह काम करता है अपने मुख्य फ़ाइल उपयोग कर रहा है पता नहीं है।

एक ही रास्ता मैं यह काम करने के लिए प्राप्त करने के लिए के बारे में सोच सकते हैं मुख्य फ़ाइल को पढ़ने के लिए है, पार्स pragma में शामिल हैं, और उसके बाद की जगह उस फ़ाइल के फ़ाइल-सामग्री के साथ pragma लाइन शामिल होने के लिए (रिकर्सिवली लागू करने सभी फ़ाइलों को शामिल करने के लिए यह वही विधि है जिसमें अन्य फाइलें स्वयं शामिल हो सकती हैं) - लेकिन इसका मतलब यह होगा कि संकलन-त्रुटियों में लिनेनर्स मुख्य फ़ाइल के असली लिननबॉर्स से मेल नहीं खाते हैं।

क्या किसी ने जीएलएसएल के लिए "शामिल" कार्यक्षमता स्थापित की है जो linenumbers काम करता है और रखता है? और यदि ऐसा है - कैसे?

उत्तर

2

क्या #version टैग के लिए पार्स करने और इस एक अलग (और पहली) स्रोत स्ट्रिंग बनाने के बारे में? इस तरह आप में अलग-अलग संस्करण टैग भी शामिल हो सकते हैं (उनके कार्यों की आवश्यकताओं के आधार पर) और उन्हें केवल एक संस्करण टैग (उच्चतम संस्करण संख्या वाला एक) तक कम करें।

+0

आप, महोदय, एक प्रतिभाशाली हैं! कोई विचार नहीं कि मैंने इसके बारे में क्यों नहीं सोचा, लेकिन मुझे लगता है कि यह मेरे लिए जाने का तरीका होगा। \ o/ – Pygmy

1

पहले सभी, वहाँ #line पूर्वप्रक्रमक निर्देश जो वर्तमान स्रोत लाइन संकलक त्रुटि संदेश में सूचना दी सेट है। इस प्रीप्रोसेसर निर्देश का उपयोग करके आप बाहरी स्रोत लाइनों को शामिल करना आसान बना सकते हैं। इससे आपकी समस्या का समाधान हो जाना चाहिए।

साथ ही, मैं shading_language_include विस्तार है, जो आप का समर्थन कार्यक्षमताओं "शामिल हैं" के लिए सहायता चाहिए पढ़ा है। यदि आपके ड्राइवर ने इसे लागू नहीं किया है, तो आप अभी भी उस वाक्यविन्यास का समर्थन कर सकते हैं जो विस्तार से परिचय देता है, ताकि आप उस विस्तार की आवश्यकता वाले शेडरों का कृपापूर्वक समर्थन कर सकें।

-1

अपने shaders फाइलों में हैं, तो आप सीपीपी (या जीसीसी -E) उन्हें कार्रवाई करने के लिए (और किसी भी # शामिल निर्देशों के साथ सौदा) उन्हें OpenGL पर पार करने से पहले उपयोग कर सकते हैं। आप अपने शेडर को पढ़ने और प्रीप्रोसेस करने के लिए popen("cpp -P main.glsl", "r") जैसे कुछ भी कर सकते हैं ...

+0

glsl ढांचे द्वारा परिभाषित प्रीप्रोसेसर प्रतीकों को स्थापित करने के लिए इस तकनीक का उपयोग करना आवश्यक है (उदाहरण के लिए __VERSION__)। – Luca

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

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