बाइंडिंग शेड्स की लागत तुच्छ नहीं हो सकती है, लेकिन यह तब तक आपकी अड़चन नहीं होगी जब तक कि आप एक ही शेड का उपयोग करने वाले सभी ऑब्जेक्ट्स को बैचने के बिना हजारों आइटम नहीं दे रहे हैं।
हालांकि मुझे यकीन नहीं है कि यह मोबाइल उपकरणों पर लागू होता है, लेकिन अगर एक स्थिर और एक समान स्थिति के बीच GPUs शाखाओं के साथ भयावह रूप से धीमा नहीं है। दोनों मान्य हैं, दोनों का उपयोग अतीत में किया गया है भविष्य में उपयोग किया जाना जारी रहेगा, जो भी आप सोचते हैं कि आपके मामले में क्लीनर होगा।
इसके अतिरिक्त, इसे पूरा करने के लिए कुछ अन्य तरीके हैं: "उबेर-शेड्स" और ओपनगार्ड शेडर प्रोग्राम्स जिस तरह से जुड़े हुए हैं, उसके साथ थोड़ा सा प्रवंचना।
"उबेर-शेड्स" अनिवार्य रूप से पहली पसंद हैं, माइनस द ब्रांचिंग, लेकिन आपके पास कई शेड होंगे। उपयोग करने के बजाय if
- बयान, आप पूर्वप्रक्रमक का उपयोग #define
, #ifdef
, #else
, #endif
, और उचित सहित विभिन्न संस्करणों, संकलन #define
आपको क्या चाहिए के लिए है।
vec4 color;
#ifdef PER_VERTEX_COLOR
color = in_color;
#else
color = obj_color;
#endif
आप shader को अलग-अलग कार्यों में भी तोड़ सकते हैं। एक शेडर है जो सभी कार्यों के लिए प्रोटोटाइप को परिभाषित करता है और उन्हें कॉल करता है, अतिरिक्त शेड्स का एक गुच्छा लिंक करता है जिसमें उचित कार्यान्वयन शामिल हैं। मैंने शैडो मैपिंग के लिए इस ट्रिक का उपयोग किया है, यह आसान बनाने के लिए कि सभी शेड्स को संशोधित किए बिना सभी ऑब्जेक्ट्स पर फ़िल्टरिंग कैसे की जाती है।
//ins, outs, uniforms
float getShadowCoefficient();
void main()
{
//shading stuff goes here
gl_FragColor = color * getShadowCoefficient();
}
फिर, मेरे पास कई अन्य shader फाइलें हो सकती हैं जो परिभाषित करती हैं getShadowCoefficient()
, आवश्यक वर्दी, और कुछ नहीं। उदाहरण के लिए, shadow_none.glsl
इसमें शामिल हैं:
float getShadowCoefficient()
{
return 1;
}
और shadow_simple.glsl
इसमें (मेरे shader से सरल है जो CSM को लागू करता है):
in vec4 eye_position;
uniform sampler2DShadow shad_tex;
uniform mat4 shad_mat;
float getShadowCoefficient()
{
vec4 shad_coord = shad_mat * eye_position;
return texture(shad_tex, shad_coord).x;
}
और आप बस यह चुन सकते हैं कि आप अलग-अलग shadow_*
शेड को जोड़कर छायांकन चाहते हैं या नहीं । इस समाधान में बहुत अच्छी तरह से अधिक ओवरहेड हो सकता है, लेकिन मैं यह सोचना चाहूंगा कि यह करने के अन्य तरीकों की तुलना में GLSL संकलक किसी भी अतिरिक्त ओवरहेड को अनुकूलित करने के लिए पर्याप्त है। मैंने इस पर कोई परीक्षण नहीं किया है, लेकिन यह वह तरीका है जो मुझे करना पसंद है।