ठीक है, मैं एक कठिन समय दे रहा हूं कि कैसे निरंतर बफ़र्स एक पाइपलाइन चरण से बंधे हैं और अपडेट किए गए हैं। मैं समझता हूं कि DirectX11 में प्रति चरण 15 shader- स्थिर बफ़र्स हो सकते हैं और प्रत्येक बफ़र 4096 स्थिरांक तक पकड़ सकता है। हालाँकि, मुझे समझ नहीं आता कि ID3D11Buffer COM का उपयोग निरंतर बफ़र्स के साथ बातचीत करने के लिए किया जाता है, जो इन बफर स्लॉट्स को भरने के लिए उपयोग किया जाने वाला एक तंत्र (या हैंडल) है या यदि वस्तु वास्तव में बफर डेटा के किसी विशेष उदाहरण को संदर्भित करती है जिसे आगे और पीछे धकेला जाता है। GPU और CPU के बीच।
मुझे लगता है कि विषय पर मेरा भ्रम एक समस्या का कारण है जो मैं दो अलग-अलग निरंतर बफ़र्स का उपयोग कर रहा हूं।
यहाँ कुछ उदाहरण shader कोड है।
cbuffer PerFrame : register(b0) {
float4x4 view;
};
cbuffer PerObject : register(b1) {
float4x4 scale;
float4x4 rotation;
float4x4 translation;
};
जिस तरह से मेरा कोड व्यवस्थित किया गया है, कैमरा प्रासंगिक प्रति फ्रेम डेटा को अपडेट करने का काम करेगा और गेमऑब्जेक्ट अपने स्वयं के ऑब्जेक्ट डेटा को अपडेट कर रहा होगा। दोनों वर्गों की अपनी ID3D11Buffer है जो इसे करने के लिए उपयोग की जाती है (हब आर्किटेक्चर का उपयोग करके, इसलिए एक गेमऑबजेक्ट क्लास दुनिया के सभी इंस्टेंट गेमऑब्जेक्ट्स के प्रतिपादन को संभाल लेगा)।
समस्या यह है कि मैं केवल एक समय में एक अद्यतन प्राप्त कर सकता हूं, स्लॉट के आधार पर और मैं अद्यतन आदेश मानता हूं कि एक बफर भरा जाता है जबकि दूसरा शून्य से बाहर हो जाता है।
यह अनिवार्य रूप से मेरा कोड है। दोनों वर्ग समान अद्यतन तर्क का उपयोग करते हैं।
static PerObjectShaderBuffer _updatedBuffer; // PerFrameShaderBuffer if Camera class
_updatedBuffer.scale = _rScale;
_updatedBuffer.rotation = _rRotation;
_updatedBuffer.translation = _rTranslation;
pDeviceContext->UpdateSubresource(pShaderBuffer, 0 , 0, &_updatedBuffer, 0, 0);
pDeviceContext->VSSetShader(pVShader->GetShaderPtr(), 0, 0);
pDeviceContext->PSSetShader(pPShader->GetShaderPtr(), 0, 0);
pDeviceContext->VSSetConstantBuffers(1, 1, &pShaderBuffer);
pDeviceContext->IASetVertexBuffers(0, 1, &pVertexBuffer, &vStride, &_offset );
pDeviceContext->IASetPrimitiveTopology(topologyType);
pDeviceContext->Draw(bufSize, 0);
मेरे मुख्य प्रश्न हैं -
- क्या मुझे UpdateSubresource कॉल के साथ इसे अपडेट करने के लिए ShaderBuffer को सेट या बाइंड करने की आवश्यकता है? (इसका मतलब यह है कि यह पाइपलाइन में होने पर ही हेरफेर करें) या क्या यह डेटा का एक ब्लॉब है जो VSSetConstantBuffer कॉल के साथ भेजा जाएगा? (मतलब डेटा को बाइंड करने और अपडेट करने का क्रम मायने नहीं रखता, मैं इसे पाइपलाइन में या किसी तरह सीपीयू में अपडेट कर सकता हूं)
- बफर को सेट या बाइंड करते समय, क्या मुझे PerOrame बफर को अपडेट करने के लिए PerFrame बफर और स्लॉट 1 को अपडेट करने के लिए स्लॉट 0 को रेफर करने की आवश्यकता है? क्या मेरे कोड में इस कॉल से किसी तरह का भ्रम हो सकता है जिससे सभी बफ़र्स ओवरराइट हो सकते हैं?
- डी 3 डी 11 कैसे जानता है कि मैं किस बफर को अपडेट या मैप करना चाहता हूं? क्या यह पता है कि ID3D11Buffer COM का उपयोग किया गया है?
संपादित करें -
ऊपर दिए गए उदाहरण में निरंतर बफर रजिस्टर टैग को बदला। के बजाय (b #) का उपयोग करना (c #) किसी कारण से बफ़र्स को सही तरीके से अपडेट करने से प्रभावित कर रहा था। निश्चित नहीं है कि मैंने मूल सिंटैक्स कहाँ से लिया है या यदि यह बिल्कुल मान्य है, लेकिन यह मेरी मुख्य समस्या है।