विभिन्न वस्तुओं के लिए अलग-अलग शेड्स डायरेक्टएक्स 11


13

मैं सीख रहा हूं Direct3D 11, और सभी बुनियादी ट्यूटोरियल में मैंने shader लेखन पर पाया, वर्टेक्स और पिक्सेल शेड्स लिखे गए हैं ताकि वे पूरे दृश्य को उसी तरह बदल दें। बनावट के साथ घन प्रस्तुत करना जैसे ट्यूटोरियल ...

लेकिन मुझे आश्चर्य है, आप वस्तुओं को कैसे अलग करते हैं? क्या होगा यदि आप चाहते हैं, उदाहरण के लिए, किसी वस्तु पर दर्पण की सतह को अनुकरण करने और बाकी दृश्यों को प्रस्तुत करने के लिए विभिन्न रंगों का उपयोग करें? मुझे लगता है कि अधिकांश खेलों को विभिन्न रूप और परिवर्तनों को प्राप्त करने के लिए कई शीर्ष और पिक्सेल शेड का उपयोग करना चाहिए।

धन्यवाद।

जवाबों:


23

हां, एक गेम इंजन में विभिन्न प्रकार के विभिन्न शेड होंगे। विशिष्ट पैटर्न है:

  1. इंजन को इनिशियलाइज़ करने और गेम की दुनिया को लोड करने के दौरान, उन सभी शेड्स को तैयार करें जिन्हें आप रेंडरिंग के लिए उपयोग करेंगे। "तैयार" करके मेरा मतलब है कि उन्हें मेमोरी में लोड करें, यदि आवश्यक हो तो उन्हें संकलित करें, और ID3D11Device::CreatePixelShaderडी 3 डी शेडर ऑब्जेक्ट को आवंटित करने और जाने के लिए तैयार होने के लिए सभी समान कॉल करें। ऑब्जेक्ट को किसी सरणी या किसी अन्य डेटा संरचना में रखें।

    आमतौर पर आपके पास वर्टेक्स शेड्स और पिक्सेल शेड्स के बीच एक-से-एक संबंध होगा जो एक साथ काम करने के लिए डिज़ाइन किए गए हैं। मैं उन्हें एक एकल वस्तु के रूप में समझता हूं, जिसे मैं सिर्फ एक "shader" कहता हूं, भले ही इसमें वास्तव में एक शीर्ष shader और एक पिक्सेल shader (और शायद ज्यामिति / पतवार / डोमेन शेड भी हो)।

  2. प्रत्येक फ्रेम, एक बार जब आप वस्तुओं की सूची (जाल) प्रस्तुत करना चाहते हैं, तो उन्हें shader द्वारा क्रमबद्ध करें। विचार यह है कि जितनी बार आप एक फ्रेम में शेड्स स्विच करते हैं, उतनी संख्या को एक साथ दिए गए शेडर के साथ सभी ऑब्जेक्ट्स को कम से कम करें। ऐसा इसलिए है क्योंकि स्विचिंग शेड्स कुछ महंगा ऑपरेशन है (हालाँकि आप निश्चित रूप से इसे प्रति फ्रेम कई सौ या हजार बार कर सकते हैं, इसलिए यह वास्तव में इतना महंगा नहीं है)।

    वास्तव में, आप एक कदम आगे जा सकते हैं और shader द्वारा मेश को पहले और सामग्री को दूसरे के आधार पर क्रमबद्ध कर सकते हैं। "मटेरियल" से मेरा मतलब है एक शेडर का एक संयोजन और इसके लिए बनावट और मापदंडों का एक सेट। शेड्स में आमतौर पर कुछ बनावट और संख्यात्मक पैरामीटर (निरंतर बफर में संग्रहीत) होते हैं जो उनमें फ़ीड करते हैं, इसलिए उदाहरण के लिए एक ईंट सामग्री और डामर सामग्री अलग-अलग बनावट के साथ एक ही shader कोड का उपयोग कर सकती है।

  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(...)
    

और भी बहुत कुछ है जो ऑब्जेक्ट्स, मेज़, शेड्स, इनपुट लेआउट, निरंतर बफ़र्स इत्यादि को प्रबंधित करने के बारे में कहा जा सकता है, लेकिन यह आपको शुरू करने के लिए पर्याप्त होना चाहिए। :)


आप shader और फिर सामग्री द्वारा छँटाई का प्रस्ताव देते हैं। क्या आपके पास स्विचिंग सामग्री बनाम स्विचिंग सामग्री की लागत पर कोई कठिन डेटा है? ओह, और DX9 के लिए, एक वीएस / पीएस संयोजन को "प्रोग्राम" कहा जाता है। मुझे यकीन नहीं है कि अगर वे अभी भी DX11 में उस शब्दावली का उपयोग करते हैं।
पांडा पायजामा

1
@PandaPajama यह एक अच्छा सवाल है। नहीं, मुझे स्विचिंग सामग्री या शेड्स की वास्तविक लागत के किसी भी हाल के माप की जानकारी नहीं है या नहीं है। यह दृष्टिकोण वर्षों से "सामान्य ज्ञान" है, लेकिन यह देखने के लिए कुछ वास्तविक माप करने के लायक है कि चीजें कैसे बदल गई हैं ... शायद मैं यह करूंगा कि अगर मुझे समय मिल सके। :)
नाथन रीड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.