मुझे एक बल्ड पैक क्यों नहीं मिल सकता है और एक डी 3 डी निरंतर बफर में संरेखित किया जाता है?


9

ठीक है, मुझे एक कठिन समय मिल रहा है जो एक बकल पैक है और एक hlsl निरंतर बफर में संरेखित है और मुझे यकीन नहीं है कि क्यों।

यहाँ hlsl में बफर है

cbuffer MaterialBuffer : register(b1) {
    float3 materialDiffuseAlbedo;
    float  materialSpecularExponent;
    float3 materialSpecularAlbedo;
    bool isTextured;
};

और यहाँ यह c ++ में है

struct GeometryBufferPass_MaterialBuffer {
    XMFLOAT3 diffuse;
    float specularExponent;
    XMFLOAT3 specular;
    bool isTextured;
};

मैंने बूल को हिलाने की कोशिश की है और सभी प्रकार के तरीकों को बिना किसी भाग्य के ढाँचे के साथ घुमाया है। ऐसा करने का सही तरीका क्या है?


यह क्या समस्या पैदा कर रहा है?
MichaelHouse

बूल का उपयोग यह निर्धारित करने के लिए किया जाता है कि क्या बनावट को नमूना करने के लिए शेडर की आवश्यकता है या नहीं। इस तरह मैं एक ही shader के साथ टेक्सचर्ड और अनटेक्स्टर्ड ऑब्जेक्ट्स को रेंडर कर सकता हूँ। बूल का उपयोग केवल सशर्त विवरण में किया जाता है। इसे सही डेटा नहीं मिल रहा है क्योंकि यह सभी वस्तुओं का एक समान व्यवहार कर रहा है। यह गलत है क्योंकि मेरा आकाश क्षेत्र केवल एक चीज है जिसकी बनावट इस समय है।
क्लैशनिकोवकिड

अन्य मूल्य काम करते हैं लेकिन बूल नहीं? क्या आपने shaders के लिए उपलब्ध डिबगर्स में से एक का उपयोग करके यह देखने की कोशिश की है कि इसमें क्या डाला जा रहा है?
MichaelHouse

2
चूल में बूल मान संग्रहीत करने का प्रयास करें। सच के लिए 1 के रूप में स्टोर करें और झूठ के लिए 0। बस परीक्षण के लिए, और यह भी, C ++ में 1 बाइट वैसे भी 1 बाइट है ...
गुस्तावो मैकील

3
एक बूल का आकार कार्यान्वयन पर निर्भर है। कुछ प्लेटफार्मों पर यह इंट के समान आकार का है। stackoverflow.com/questions/5067492/…
टेट्राद

जवाबों:


9

दक्षता के लिए, निरंतर बफ़र्स को ऐसे मैप किया जाएगा कि मान GPU पंजीकरण में बाधा न डालें । प्रत्येक रजिस्टर आकार में चार फ्लोट्स (16 बाइट्स) है, इसलिए निरंतर बफर संरचनाएं GPU पर एक से अधिक होनी चाहिए। यदि आप इसे मैपिंग डेटा के लिए एक सुविधा के रूप में उपयोग करना चाहते हैं, तो आपके सी ++ संरचना को तदनुसार गद्देदार किया जाना चाहिए (यह ध्यान दें, हमेशा अच्छा नहीं होता है)।

तब आपकी समस्या यह है कि एक एचएलएसएल बूलियन चार बाइट्स है, लेकिन सीपीयू की तरफ एक बाइट (आपके विशिष्ट कार्यान्वयन में)। यह आपके C ++ संरचना को ठीक से संरेखित नहीं करने का कारण बनता है: एक बूलियन मूल्य का महत्वपूर्ण बिट (0 या 1 जो मायने रखता है) मूल्य के कम से कम-हस्ताक्षरकर्ता बाइट में संग्रहीत होने जा रहा है, और चूंकि आकार स्थान से सहमत नहीं हैं मेमोरी में उस बाइट की संरचना के CPU और GPU संस्करणों में भिन्न होगा।

मैन्युअल रूप से उपयुक्त पैडिंग सम्मिलित करना और उचित 16-बाइट संरेखण सुनिश्चित करना, या केवल एक पूर्णांक के आकार का उपयोग करके, पूर्णांक की तरह, समस्या को ठीक करना चाहिए। यह धागा भी आपके काम आ सकता है क्योंकि इसमें लगभग एक ही समस्या की अधिक गहन चर्चा होती है।


1
मैं इसका पालन नहीं करता: " isTexturedउसी रजिस्टर में फिट हो जाता है क्योंकि उसे अगले एक में स्ट्रगल करना होगा। इस प्रकार यह पूरी तरह से अगले रजिस्टर में टकरा जाता है।" दूसरे रजिस्टर specularमें पहले तीन घटक होते हैं और isTexturedआखिरी में, इसलिए मैं नहीं देखता कि अगले रजिस्टर में कुछ भी गड़बड़ हो जाए? 1-बाइट बनाम 4-बाइट बूल लंबाई स्पष्ट रूप से मायने रखती है, लेकिन या तो एक specularही रजिस्टर में फिट होगा ।
नाथन रीड

तुम सही हो; मैंने खुद को रजिस्टरों के आकार बनाम प्रकारों के आकार के बारे में भ्रमित किया और मैपिंग के गलत प्रतिनिधित्व के साथ आया। एकमात्र समस्या स्मृति में प्रासंगिक बाइट का स्थान है। मैंने अपने उत्तर को उसी के अनुसार समायोजित किया है।

पूरी तरह से आपके उत्तर को स्वीकार करना। जैसा कि आपने उल्लेख किया है, यह एक बड़ा / छोटा एंडियन मुद्दा था और एक इंट ने इसे हल किया।
क्लैशनिकोवकिड

3

ठीक है, कुछ पढ़ा और देखा कि एक hlsl बूल अनिवार्य रूप से एक 32 बिट पूर्णांक है। इसलिए मैंने अपनी समस्या को हल करने के लिए सिर्फ c ++ स्ट्रक्चर में एक int का उपयोग किया।

struct GeometryBufferPass_MaterialBuffer {
    XMFLOAT3 diffuse;
    float specularExponent;
    XMFLOAT3 specular;
    int isTextured;
};

आप बूल प्रकार क्यों नहीं रखते हैं, लेकिन सिर्फ संकलक पक्ष में int का उपयोग करें? बस शब्दार्थ रखना है।
गुस्तावो मैकिएल

हाँ, यही मैं ऊपर कर रहा हूँ। निरंतर सीपीयू जीपीयू पक्ष के लिए संरचनात्मक सीपीयू पक्ष और एक बूल के लिए एक पूर्णांक का उपयोग किया।
क्लैशनिकोवकिड

0

फ्लोट, बूल और इंट एंडियन के लिए विशेष रूप से कई मदों के लिए आवश्यक लाइन अप नहीं करते हैं।

यहां सूचीबद्ध कुछ उदाहरणों में इंट या फ्लोट पर स्विच करना, एक्सएमएलएफओएटी 3 मदों के बीच इसके संयोजन के रूप में है ताकि इसे सही ढंग से संदर्भित किया जा सके। हालाँकि अगर आपको int, float (कोई भी XM प्रकार) के लिए संरचना में कोई सरणी या कई आइटम घोषित करने की आवश्यकता है, तो आप संभवतः पाएंगे कि GPU मान CPU संरचना में सेट किए गए मानों से मेल नहीं खाते हैं।

मैं निश्चित रूप से किया था जब प्रकाश प्रकार के लिए इस्तेमाल किया जा करने के लिए प्रकार की एक सरणी जोड़ने।

सबसे आसान तरीका है कि मैं 16 प्रकारों से संरेखित एक्सएम प्रकारों से चिपके रहना चाहता हूं, जिसमें व्यर्थ तत्वों / बाइट्स की आवश्यकता हो सकती है, लेकिन आपके लिए एंडियन को सॉर्ट करना होगा। ईजी एक्सएमएमई 4 और सिर्फ अपने मूल्य के लिए पहले तत्व .x का उपयोग किया है, या यदि आपको आवश्यकता है तो अन्य तत्वों को दूसरे उद्देश्य के लिए उपयोग करें लेकिन इसका अर्थ है खराब नामकरण (टिप्पणी करना सुनिश्चित करें)। नोट: XMINT2 सरणी भी तार्किक क्रम से बाहर होगी

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.