আইএফ স্টেটমেন্টের সাথে একের পরিবর্তে দুটি শেডার ব্যবহার করা


9

আমি তুলনামূলকভাবে বড় ওপেনগল ইএস 1.1 উত্সটি ইএস 2.0 তে পোর্টিংয়ের কাজ করছি।

ওপেনগিএল ইএস ২.০ (যার অর্থ, সবকিছু ছায়াময় ব্যবহার করে) এ, আমি তিন বার একটি চাঁচি আঁকতে চাই।

  1. প্রথমটি, একটি অভিন্ন রঙের সাথে (আলা পুরানো গ্লো কালার 4f)।

  2. দ্বিতীয়টি, প্রতি-ভার্টেক্স রঙের সাথে (টিপোটটিতে এর ভার্টেক্স রঙের অ্যারেও রয়েছে)

  3. তৃতীয়টি, প্রতি-ভার্টেক্স টেক্সচার সহ

  4. এবং প্রতি চতুর্থ টেক্সচার এবং রঙ উভয়ই চতুর্থ হতে পারে। এবং তারপরে হতে পারে 5 তম একটি, স্বাভাবিকের পাশাপাশি ..

আমি যতদূর জানি বাস্তবায়নের সাথে আমার দুটি পছন্দ আছে। প্রথমটি শ্যাডার তৈরি করা যা উপরের সমস্তগুলিকে সমর্থন করে, এমন একটি ইউনিফর্ম যা আচরণ পরিবর্তন করতে সেট করা হয় (উদাহরণস্বরূপ একক রঙের ইউনিফর্ম ব্যবহার করুন, বা প্রতি-ভার্টেক্স রঙের ইউনিফর্ম)।

দ্বিতীয় পছন্দটি প্রতিটি পরিস্থিতির জন্য আলাদা শেডার তৈরি করা। কিছু কাস্টম শেডার প্রিপ্রোসেসিংয়ের সাথে এটি করা এতটা জটিল নয়, তবে উদ্বেগটি হ'ল আঁকানো বস্তুর মধ্যে শেডারগুলি পরিবর্তন করতে পারফরম্যান্স ব্যয়। আমি পড়েছি যে এটি তুচ্ছভাবে ছোট নয়।

আমি বোঝাতে চাইছি, সর্বোত্তম উপায় হ'ল উভয় তৈরি করা এবং পরিমাপ করা, তবে কোনও ইনপুট শুনতে ভাল লাগবে।

উত্তর:


10

শাখাগুলির কার্যকারিতা ব্যয়ও তুচ্ছভাবে ছোট হতে পারে না। আপনার ক্ষেত্রে সমস্ত শিখুন এবং টুকরো টানা আপনার ছায়াগুলির মধ্য দিয়ে একই পথ অবলম্বন করবে, সুতরাং আধুনিক ডেস্কটপ হার্ডওয়্যারটিতে এটি যতটা খারাপ হবে তেমন খারাপ হবে না, তবে আপনি ES2 ব্যবহার করছেন যা বোঝায় যে আপনি আধুনিক ব্যবহার করছেন না ডেস্কটপ হার্ডওয়্যার

ব্রাঞ্চিংয়ের সবচেয়ে খারাপ পরিস্থিতি এরকম কিছু ঘটবে:

  • শাখার উভয় পক্ষই মূল্যায়ন করা হয়।
  • শেডার সংকলক দ্বারা একটি "মিক্স" বা "পদক্ষেপ" নির্দেশ তৈরি করা হবে এবং কোন দিকটি ব্যবহার করবেন তা সিদ্ধান্ত নিতে আপনার কোডে .োকানো হবে।

এবং এই সমস্ত অতিরিক্ত নির্দেশাবলী আপনার আঁকানো প্রতিটি শীর্ষবিন্দু বা খণ্ডের জন্য পরিচালিত হবে। এটি সম্ভাব্য কয়েক মিলিয়ন অতিরিক্ত নির্দেশাবলীর একটি শেডার পরিবর্তনের ব্যয়ের তুলনায় ওজন করতে হবে।

অ্যাপলের " ওপেনজিএল ইএস প্রোগ্রামিং গাইড আইওএসের জন্য " (যা আপনার টার্গেট হার্ডওয়ারের জন্য প্রতিনিধি হিসাবে নেওয়া যেতে পারে) এর শাখা প্রশাখার কথাটি বলে:

ব্রাঞ্চিং এড়িয়ে চলুন

শাখা ছায়াময়গুলিতে নিরুৎসাহিত করা হয়, কারণ তারা 3 ডি গ্রাফিক্স প্রসেসরের সমান্তরালে অপারেশন চালানোর দক্ষতা হ্রাস করতে পারে। যদি আপনার শেডারের অবশ্যই শাখা ব্যবহার করা থাকে তবে এই প্রস্তাবগুলি অনুসরণ করুন:

  • সেরা পারফরম্যান্স: শেডার সংকলন করা হলে একটি ধ্রুবক সম্পর্কে শাখা।
  • গ্রহণযোগ্য: ইউনিফর্ম ভেরিয়েবলের শাখা।
  • সম্ভাব্য ধীর: শেডারের অভ্যন্তরে গণনা করা কোনও মানের উপর ব্র্যাঞ্চিং।

অনেকগুলি নোবস এবং লিভারের সাহায্যে বড় শেডার তৈরি করার পরিবর্তে নির্দিষ্ট রেন্ডারিংয়ের জন্য বিশেষায়িত ছোট শেডারগুলি তৈরি করুন। আপনার শেডারগুলিতে শাখাগুলির সংখ্যা হ্রাস করা এবং আপনি তৈরি শেডারগুলির সংখ্যা বাড়ানোর মধ্যে একটি বাণিজ্য রয়েছে। বিভিন্ন বিকল্প পরীক্ষা করুন এবং দ্রুত সমাধানটি চয়ন করুন।

এমনকি যদি আপনি সন্তুষ্ট হন যে আপনি এখানে "গ্রহণযোগ্য" স্লটে রয়েছেন, তবুও আপনাকে বিবেচনা করতে হবে যে 4 বা 5 টির মধ্যে নির্বাচন করতে হবে, আপনি আপনার ছায়ায় নির্দেশের সংখ্যা বাড়িয়ে তুলছেন। আপনার টার্গেট হার্ডওয়ারের নির্দেশনা গণনার সীমা সম্পর্কে আপনার সচেতন হওয়া উচিত এবং উপরের অ্যাপল লিঙ্কটি থেকে আবার উদ্ধৃতি দিয়ে আপনি তাদের উপরে না গিয়েছেন তা নিশ্চিত করা উচিত:

এই সীমা ছাড়িয়ে গেলে ওপেনগিএল ইএস বাস্তবায়নের কোনও সফ্টওয়্যার ফ্যালব্যাক বাস্তবায়নের প্রয়োজন হয় না; পরিবর্তে, শেডারটি কেবল সংকলন করতে বা লিঙ্ক করতে ব্যর্থ হয়।

এর মধ্যে কোনওটিই বলার অপেক্ষা রাখে না যে শাখাগুলি করা আপনার প্রয়োজনের জন্য সেরা সমাধান নয় । আপনি উভয় পদ্ধতির প্রোফাইল করা উচিত তা আপনি সঠিকভাবে চিহ্নিত করেছেন, তাই এটিই চূড়ান্ত প্রস্তাবনা। তবে কেবল সচেতন থাকবেন যে ছায়ারগুলি আরও জটিল হয়ে উঠছে, একটি শাখা-ভিত্তিক সমাধান কয়েকটি শেডার পরিবর্তনের চেয়ে বেশিরভাগ ওভারহেড দিতে পারে।


3

বাইন্ডিং শেডারগুলির ব্যয়টি তুচ্ছ হতে পারে না, তবে যদি আপনি একই শেডারের ব্যবহার না করে এমন সমস্ত বস্তু বাছাই না করে হাজার হাজার আইটেম সরবরাহ না করেন তবে এটি আপনার বাধা হয়ে দাঁড়াবে না।

যদিও এটি নিশ্চিত নয় যে এটি মোবাইল ডিভাইসে প্রযোজ্য কিনা, তবে শর্তটি ধ্রুবক এবং ইউনিফর্মের মধ্যে থাকলে জিপিইউগুলি শাখাগুলির সাথে ভয়ঙ্করভাবে ধীর হয় না। উভয়ই বৈধ, উভয়ই অতীতে ব্যবহৃত হয়েছিল ভবিষ্যতে ব্যবহার করা অব্যাহত থাকবে, আপনার ক্ষেত্রে যেটি পরিষ্কার মনে হয় তাকে বেছে নিন।

অতিরিক্তভাবে, এটি সম্পাদন করার জন্য আরও কয়েকটি উপায় রয়েছে: "ওবার-শেডার" এবং ওপেনজিএল শেডার প্রোগ্রামগুলি যেভাবে সংযুক্ত রয়েছে তার সাথে সামান্য কৌশল।

"উবার-শেডারগুলি" মূলত প্রথম পছন্দ হয়, শাখাটি বিয়োগ করে, তবে আপনার একাধিক শেডার থাকবে। ব্যবহার করার পরিবর্তে 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_*শেডারকে যুক্ত করেই বেছে নিতে পারেন। এই সমাধানটিতে খুব বেশি ওভারহেড থাকতে পারে তবে আমি ভাবতে চাই যে জিএলএসএল সংকলক এটি করার অন্যান্য পদ্ধতির তুলনায় কোনও অতিরিক্ত ওভারহেড অপ্টিমাইজ করার পক্ষে যথেষ্ট ভাল। আমি এটি নিয়ে কোনও পরীক্ষা চালিয়েছি না, তবে এটি করা আমার পছন্দ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.