হ্যাঁ, একটি গেম ইঞ্জিনের সাধারণত বিভিন্ন ধরণের শেডার থাকে। সাধারণ প্যাটার্নটি হ'ল:
ইঞ্জিনটি আরম্ভ করার সময় এবং গেমের জগতটি লোড করার সময়, আপনি রেন্ডারিংয়ের জন্য ব্যবহার করবেন এমন সমস্ত শেডার প্রস্তুত করুন। "প্রস্তুত" বলতে বোঝায় এগুলি মেমরিতে লোড করুন, প্রয়োজনে তাদের সংকলন করুন ID3D11Device::CreatePixelShader
এবং ডি 3 ডি শেডার অবজেক্টগুলি বরাদ্দ করা এবং যেতে প্রস্তুত পেতে সমস্ত অনুরূপ কল করুন। বস্তুগুলিকে একটি অ্যারে বা অন্য কোনও ডেটা স্ট্রাকচারে রাখুন।
সাধারণত আপনার ভার্টেক্স শেডার এবং পিক্সেল শেডারগুলির মধ্যে একের সাথে সম্পর্ক থাকবে যা একসাথে কাজ করার জন্য ডিজাইন করা হয়েছে। আমি তাদেরকে একটি একক বস্তু হিসাবে মনে করি, যা আমি কেবল একটি "শেডার" বলি, যদিও এতে সত্যই একটি ভার্টেক্স শেডার এবং একটি পিক্সেল শেডার রয়েছে (এবং সম্ভবত জ্যামিতি / হাল্ল / ডোমেন শেডারও রয়েছে)।
প্রতিটি ফ্রেম, একবার আপনি রেন্ডার করার জন্য অবজেক্টের (মেস) তালিকা পেয়ে গেলে শেডার অনুসারে তাদের বাছাই করুন। ধারণাটি হ'ল আপনি কোনও ফ্রেমে শ্যাডারগুলি স্যুইচ করে, প্রদত্ত শেডার দিয়ে সমস্ত বস্তু এক সাথে আঁকিয়ে কতবার ন্যূনতম করুন। এর কারণ শেডার স্যুইচ করা কিছুটা ব্যয়বহুল ক্রিয়াকলাপ (যদিও আপনি অবশ্যই এটি ফ্রেম প্রতি কয়েকশ বা এক হাজারবার করতে পারেন, সুতরাং এটি সত্যই এত ব্যয়বহুল নয়)।
প্রকৃতপক্ষে, আপনি আরও এক ধাপ এগিয়ে যেতে পারেন এবং শেডার দ্বারা প্রথমে এবং দ্বিতীয় উপাদানটি মেসগুলি বাছাই করতে পারেন। "উপাদান" দ্বারা, আমি বলতে চাইছি এটি একটি শেডার এবং টেক্সচারের সেট এবং এর জন্য পরামিতিগুলির সংমিশ্রণ। শেডারগুলিতে সাধারণত কিছু টেক্সচার এবং সংখ্যাসূচক প্যারামিটার থাকে (ধ্রুব বাফারগুলিতে সঞ্চিত থাকে) যা এগুলিতে ফিড দেয়, উদাহরণস্বরূপ একটি ইটের উপাদান এবং অ্যাসফল্ট উপাদান একই শ্যাডার কোডটি বিভিন্ন টেক্সচার সহ ব্যবহার করতে পারে।
আঁকতে, শেডারের উপরে কেবল লুপ করুন, প্রতিটি শেডারে ID3D11DeviceContext
সেট করুন , কোনও প্যারামিটার (ধ্রুব বাফার, টেক্সচার ইত্যাদি) সেট করুন, তারপরে অবজেক্টগুলি আঁকুন। সিউডোকোডে শেডার / উপাদানগুলির পার্থক্য সহ আমি উল্লেখ করেছি:
for each shader:
// Set the device context to use this shader
pContext->VSSetShader(shader.pVertexShader);
pContext->PSSetShader(shader.pPixelShader);
for each material that uses this shader:
// Set the device context to use any constant buffers, textures, samplers,
// etc. needed for this material
pContext->VSSetConstantBuffers(...);
pContext->PSSetConstantBuffers(...);
pContext->PSSetShaderResources(...);
pContext->PSSetSamplers(...);
for each mesh that uses this material:
// Set any constant buffers containing parameters specific to the mesh
// (e.g. world matrix)
pContext->VSSetConstantBuffers(...);
// Set the context to use the vertex & index buffers for this mesh
pContext->IASetInputLayout(mesh.pInputLayout);
pContext->IASetVertexBuffers(...);
pContext->IASetIndexBuffer(...);
pContext->IASetPrimitiveTopology(...)
// Draw it
pContext->DrawIndexed(...)
অবজেক্টস, মেসস, শেডারস, ইনপুট লেআউটস, ধ্রুবক বাফার্স ইত্যাদির পরিচালনা সম্পর্কে আরও অনেক কিছু বলা যেতে পারে তবে আপনাকে শুরু করার জন্য এটি যথেষ্ট হওয়া উচিত। :)