इंजन को इनिशियलाइज़ करने और गेम की दुनिया को लोड करने के दौरान, उन सभी शेड्स को तैयार करें जिन्हें आप रेंडरिंग के लिए उपयोग करेंगे। "तैयार" करके मेरा मतलब है कि उन्हें मेमोरी में लोड करें, यदि आवश्यक हो तो उन्हें संकलित करें, और ID3D11Device::CreatePixelShader
डी 3 डी शेडर ऑब्जेक्ट को आवंटित करने और जाने के लिए तैयार होने के लिए सभी समान कॉल करें। ऑब्जेक्ट को किसी सरणी या किसी अन्य डेटा संरचना में रखें।
आमतौर पर आपके पास वर्टेक्स शेड्स और पिक्सेल शेड्स के बीच एक-से-एक संबंध होगा जो एक साथ काम करने के लिए डिज़ाइन किए गए हैं। मैं उन्हें एक एकल वस्तु के रूप में समझता हूं, जिसे मैं सिर्फ एक "shader" कहता हूं, भले ही इसमें वास्तव में एक शीर्ष shader और एक पिक्सेल shader (और शायद ज्यामिति / पतवार / डोमेन शेड भी हो)।
प्रत्येक फ्रेम, एक बार जब आप वस्तुओं की सूची (जाल) प्रस्तुत करना चाहते हैं, तो उन्हें shader द्वारा क्रमबद्ध करें। विचार यह है कि जितनी बार आप एक फ्रेम में शेड्स स्विच करते हैं, उतनी संख्या को एक साथ दिए गए शेडर के साथ सभी ऑब्जेक्ट्स को कम से कम करें। ऐसा इसलिए है क्योंकि स्विचिंग शेड्स कुछ महंगा ऑपरेशन है (हालाँकि आप निश्चित रूप से इसे प्रति फ्रेम कई सौ या हजार बार कर सकते हैं, इसलिए यह वास्तव में इतना महंगा नहीं है)।
वास्तव में, आप एक कदम आगे जा सकते हैं और shader द्वारा मेश को पहले और सामग्री को दूसरे के आधार पर क्रमबद्ध कर सकते हैं। "मटेरियल" से मेरा मतलब है एक शेडर का एक संयोजन और इसके लिए बनावट और मापदंडों का एक सेट। शेड्स में आमतौर पर कुछ बनावट और संख्यात्मक पैरामीटर (निरंतर बफर में संग्रहीत) होते हैं जो उनमें फ़ीड करते हैं, इसलिए उदाहरण के लिए एक ईंट सामग्री और डामर सामग्री अलग-अलग बनावट के साथ एक ही shader कोड का उपयोग कर सकती है।
आकर्षित करने के लिए, केवल शेड्स पर लूप करें, प्रत्येक शेडर को अंदर 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(...)
और भी बहुत कुछ है जो ऑब्जेक्ट्स, मेज़, शेड्स, इनपुट लेआउट, निरंतर बफ़र्स इत्यादि को प्रबंधित करने के बारे में कहा जा सकता है, लेकिन यह आपको शुरू करने के लिए पर्याप्त होना चाहिए। :)