2012-11-23 38 views
6

मेरे shaders अक्सर ही कार्यक्षमता का ज्यादा हिस्सा। उदाहरण के लिए फैलाने/specular प्रकाश की गणना। मैं इसे एक बार लिखना चाहता हूं और फिर अलग-अलग शेडरों में कोड का पुन: उपयोग करना चाहता हूं।पुन: प्रयोज्य glsl कोड कैसे लिखें?

GLSL फ़ाइलों का ज्ञान नहीं है, और एक सी की तरह #include पूर्वप्रक्रमक निर्देश के लिए कोई समर्थन नहीं है।

मैं जानता हूँ कि GLSL कई cstrings से स्रोत संकलन के लिए समर्थन है, लेकिन आप कैसे पता होगा जो शामिल करने के लिए cstrings? क्या आप अपना खुद का संस्करण शामिल करते हैं? या आप अपने प्रत्येक शेडर्स के लिए कुछ प्रकार के मेटाफाइल बनाते हैं?

उत्तर

4

बड़ी परियोजनाओं में शेडर्स अक्सर पहले भाग में इकट्ठे होते हैं (या जब ग्राफिक विकल्प बदल जाते हैं) तो वे सभी विक्रेता विशिष्ट कार्यात्मक शामिल होंगे और उपयोगकर्ता मशीन और सेटिंग्स के लिए अनुकूलित किए जाएंगे। और न केवल शेडर बल्कि पाइपलाइन प्रस्तुत करने के कुछ चरणों में भी।
आप HTML \ सीएसएस \ जावास्क्रिप्ट कोड है कि PHP स्क्रिप्ट अनुरोध के जवाब में उल्टी के रूप में GLSL इलाज कर सकते हैं। और आप लूप में कोडिंग इंजेक्शन (उदाहरण के लिए बनावट लुकअप की मात्रा) के रूप में एक ही तकनीक का उपयोग कर सकते हैं। और यह ग्राफिक डिजाइनरों के लिए भी अच्छा है क्योंकि उनके पास पैरामीटरकरण - चेकबुक, इनपुट फ़ील्ड इत्यादि के माध्यम से शेडर स्रोत पर सरल नियंत्रण होता है और यह अद्वितीय मामलों के लिए अद्वितीय शेडर का उत्पादन कर सकता है।

1

मैं http://blackpixel.com/blog/494/xcode-using-includes-in-opengl-shaders/ के आधार पर एक कस्टम समाधान [404 अब] की है। असल में यह कहा गया है कि आप फ़ाइलों को प्रीप्रोसेस करने के लिए m4 टूल का उपयोग कर सकते हैं।

include(Utils.glsl) 
include(Colors.glsl) 

... 

void main (void) { 
    ... 
} 

Xcode, सभी glsl फ़ाइलों के लिए "कॉपी बंडल संसाधन" जोड़ें:

GLSL स्रोत फ़ाइलों में सिर्फ वांछित टुकड़ा आप पुन: उपयोग करना चाहते हैं।

इस खोल स्क्रिप्ट के साथ एक "रन स्क्रिप्ट" चरण जोड़ें:

#!/bin/sh 

cd ${BUILT_PRODUCTS_DIR}/${WRAPPER_NAME} 
find . -name "*.fsh" | while read file; do 
    echo Preprocess $file 
    m4 "$file" > "$file.tmp" 
    mv "$file.tmp" "$file" 
done 

exit 0 

स्क्रिप्ट मानती है कि आपके shaders .fsh एक्सटेंशन मौजूद है। अपने शेडर एक्सटेंशन से मेल खाने के लिए इसे संशोधित करना मुश्किल है।

चेतावनी दी रहें: अपने shaders लगभग किसी को भी आसानी से सुलभ हो जाएगा। आप इसे विकास के लिए उपयोग कर सकते हैं और उन्हें जारी करने से पहले तारों में परिवर्तित कर सकते हैं (असली सुरक्षा नहीं जब तक कि आप इसे एन्क्रिप्ट नहीं करते ...)।

इसके अलावा, यदि शेडर्स के बीच कोई साझाकरण नहीं है, तो आप बहुत सारे अप्रयुक्त कोड के साथ समाप्त हो जाएंगे। मुझे लगता है कि शेडर कंपाइलर इसका ख्याल रखेगा लेकिन कुछ प्रदर्शन दंड होने पर मुझे 100% यकीन नहीं है।

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