বাইন্ডিং শেডারগুলির ব্যয়টি তুচ্ছ হতে পারে না, তবে যদি আপনি একই শেডারের ব্যবহার না করে এমন সমস্ত বস্তু বাছাই না করে হাজার হাজার আইটেম সরবরাহ না করেন তবে এটি আপনার বাধা হয়ে দাঁড়াবে না।
যদিও এটি নিশ্চিত নয় যে এটি মোবাইল ডিভাইসে প্রযোজ্য কিনা, তবে শর্তটি ধ্রুবক এবং ইউনিফর্মের মধ্যে থাকলে জিপিইউগুলি শাখাগুলির সাথে ভয়ঙ্করভাবে ধীর হয় না। উভয়ই বৈধ, উভয়ই অতীতে ব্যবহৃত হয়েছিল ভবিষ্যতে ব্যবহার করা অব্যাহত থাকবে, আপনার ক্ষেত্রে যেটি পরিষ্কার মনে হয় তাকে বেছে নিন।
অতিরিক্তভাবে, এটি সম্পাদন করার জন্য আরও কয়েকটি উপায় রয়েছে: "ওবার-শেডার" এবং ওপেনজিএল শেডার প্রোগ্রামগুলি যেভাবে সংযুক্ত রয়েছে তার সাথে সামান্য কৌশল।
"উবার-শেডারগুলি" মূলত প্রথম পছন্দ হয়, শাখাটি বিয়োগ করে, তবে আপনার একাধিক শেডার থাকবে। ব্যবহার করার পরিবর্তে if
- বিবৃতি, আপনি প্রাক প্রসেসর ব্যবহার #define
, #ifdef
, #else
, #endif
, এবং সঠিক সহ বিভিন্ন সংস্করণ, কম্পাইল #define
আপনার যা প্রয়োজন জন্য গুলি।
vec4 color;
#ifdef PER_VERTEX_COLOR
color = in_color;
#else
color = obj_color;
#endif
আপনি শেডারকে পৃথক ফাংশনে বিভক্ত করতে পারেন। একটি শেডার থাকুন যা সমস্ত ফাংশনগুলির জন্য প্রোটোটাইপগুলি সংজ্ঞায়িত করে এবং তাদেরকে কল করে, অতিরিক্ত শেডারের একটি গুচ্ছকে যুক্ত করে যাতে যথাযথ প্রয়োগগুলি অন্তর্ভুক্ত থাকে। আমি সমস্ত ছায়া গো সংশোধন না করে সমস্ত বস্তুতে কীভাবে ফিল্টারিং করা হয় তা সরিয়ে আনা সহজ করতে ছায়া ম্যাপিংয়ের জন্য আমি এই কৌশলটি ব্যবহার করেছি।
//ins, outs, uniforms
float getShadowCoefficient();
void main()
{
//shading stuff goes here
gl_FragColor = color * getShadowCoefficient();
}
তারপরে, আমার কাছে অন্যান্য একাধিক শেডার ফাইল থাকতে পারে যা সংজ্ঞায়িত করে getShadowCoefficient()
, প্রয়োজনীয় ইউনিফর্ম এবং অন্য কিছুই। উদাহরণস্বরূপ, shadow_none.glsl
রয়েছে:
float getShadowCoefficient()
{
return 1;
}
এবং shadow_simple.glsl
এতে রয়েছে (আমার শেডার থেকে সরলীকৃত যা সিএসএম প্রয়োগ করে):
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_*
শেডারকে যুক্ত করেই বেছে নিতে পারেন। এই সমাধানটিতে খুব বেশি ওভারহেড থাকতে পারে তবে আমি ভাবতে চাই যে জিএলএসএল সংকলক এটি করার অন্যান্য পদ্ধতির তুলনায় কোনও অতিরিক্ত ওভারহেড অপ্টিমাইজ করার পক্ষে যথেষ্ট ভাল। আমি এটি নিয়ে কোনও পরীক্ষা চালিয়েছি না, তবে এটি করা আমার পছন্দ।