2013-04-23 11 views
5

में एकाधिक वर्टेक्स बफर का उपयोग करना मेरे पास एक सी ++ डायरेक्टएक्स 11 रेंडरर है जिसे मैं लिख रहा हूं।डीएक्स 10/डीएक्स 11

मैंने कंकाल एनिमेशन को समर्थन देने के लिए COLLADA डेटा आयात करने के लिए एक COLLADA 1.4.1 लोडर लिखा है।

मैं इस बिंदु पर लोडर को मान्य कर रहा हूं (और मैंने पहले एक अन्य प्रस्तुतकर्ता में COLLADA का समर्थन किया है जिसे मैंने पहले विभिन्न तकनीक का उपयोग करके लिखा है) और मैं डीएलएक्स 10/11 के साथ कोलाडा से मेल खाने वाली समस्या में भाग रहा हूं।

अनोखा शीर्ष पदों में से एक शीर्ष बफर:

मैं डेटा के 3 अलग शिखर बफ़र्स की है। अद्वितीय मानदंडों का एक वर्टेक्स बफर। अद्वितीय बनावट निर्देशांक का एक वर्टेक्स बफर।

ये शिखर बफ़र्स अलग सरणी लंबाई होते हैं (पदों 2910 तत्व है, Normals 9000 से भी अधिक है, और बनावट निर्देशांक मोटे तौर पर 3200 के है)

कोलाडा एक त्रिकोण सूची जो मुझे इन सरणियों में से प्रत्येक में सूचकांक देता है प्रदान करता है एक दिए गए त्रिभुज के लिए (वर्बोज़ और विचित्र रूप से पहले किया जाता है, लेकिन आखिरकार यह आपके साथ काम करने के बाद सरल हो जाता है।)

यह जानकर कि डीएक्स 10/11 एकाधिक वर्टेक्स बफर का समर्थन करता है मुझे लगा कि मैं डीएक्स 10/11 इंडेक्स भर रहा हूं इन बफरों में से प्रत्येक में सूचकांक के साथ बफर * और * (यह महत्वपूर्ण हिस्सा है), ये सूचकांक अलग-अलग हो सकते हैं या त्रिकोण का एक दिया बिंदु।

दूसरे शब्दों में, मैं तीन शीर्ष बफ़र्स सेट कर सकते हैं, सही इनपुट लेआउट सेट, और फिर सूचकांक बफर में मैं के बराबर कर दिया जाएगा:

l_aIndexBuffer[ NumberOfTriangles * 3 ] 

for(i = 0; i < NumberOfTriangles; i++) 
{ 
    l_aIndexBufferData.add(triangle[i].Point1.PositionIndex) 
    l_aIndexBufferData.add(triangle[i].Point1.NormalIndex) 
    l_aIndexBufferData.add(triangle[i].Point1.TextureCoordinateIndex) 
} 

दस्तावेज में कई शीर्ष बफ़र्स का उपयोग कर के बारे में डायरेक्टएक्स इस बारे में कोई जानकारी नहीं देता है कि यह इंडेक्स बफर को कैसे प्रभावित करता है (इस पर और अधिक।)

कोड चलाने से अजीब प्रतिपादन परिणाम मिलते हैं जहां मैं जाल देख सकता था, मुझे अंतःस्थापित रूप से सही ढंग से खींचा जा रहा था (अजीब बहुभुज लेकिन लगभग एक तिहाई बिंदु सही जगह पर थे - संकेत - संकेत)

मुझे लगा कि मैं इस बिंदु पर (कल) अपने डेटा या मेरे सूचकांक खराब कर दूंगा, इसलिए मैंने इसे सभी को दर्दनाक रूप से मान्य किया, और इसलिए मुझे लगा कि मैं अपने इनपुट या कुछ और पर खराब कर रहा था। मैंने इसे सामान्य और बनावट बफर से मानों का उपयोग करके वैकल्पिक रूप से पिक्सेल शेडर द्वारा उपयोग किए गए रंग मान को सेट करके समाप्त कर दिया, रंग सही थे इसलिए मुझे पैडिंग समस्या का सामना नहीं करना पड़ा।

अंत में मैं निष्कर्ष है कि DX10/11 डेटा एक अलग फैशन में आदेश दिया उम्मीद होना चाहिए के लिए आया था, इसलिए मैं इस फैशन में सूचकांक भंडारण की कोशिश की: अजीब तरह पर्याप्त

indices.add(Point1Position index) 
indices.add(Point2Position index) 
indices.add(Point3Position index) 
indices.add(Point1Normal index) 
indices.add(Point2Normal index) 
indices.add(Point3Normal index) 
indices.add(Point1TexCoord index) 
indices.add(Point2TexCoord index) 
indices.add(Point3TexCoord index) 

, यह एक गाया जाल झुकेंगे जो 1/3 सही - संकेत - संकेत देखा।

मैंने तब अनुमान लगाया कि शायद डीएक्स 10/डीएक्स 11 चाहता था कि 'वर्टेक्स बफर द्वारा' संग्रहित इंडेक्स का अर्थ है कि मैं पहले सभी त्रिकोणों के लिए सभी स्थिति सूचकांक जोड़ूंगा, फिर सभी त्रिकोणों के लिए सभी सामान्य सूचकांक, फिर सभी बनावट सभी त्रिकोणों के लिए सूचकांक समन्वय।

इससे एक और 1/3 सही (दिखने वाला) जाल मिला।

इससे मुझे लगता है - ठीक है, निश्चित रूप से डीएक्स 10/11 आपको एकाधिक वर्टेक्स बफर से स्ट्रीम करने की क्षमता प्रदान नहीं करेगा और फिर वास्तव में प्रति त्रिकोण बिंदु केवल एक सूचकांक की अपेक्षा करेगा?

केवल पदों की शिखर बफर में सूचकांक सहित एक ठीक से प्रदान की गई जाल है कि दुर्भाग्य से गलत normals और बनावट निर्देशांक का उपयोग करता है अर्जित करता है।

ऐसा लगता है कि सूचकांक बफर में सामान्य और बनावट समन्वय सूचकांक डाल ठीक से प्रदान की गई जाल से अधिक गलत ड्राइंग का कारण बना।

क्या यह अपेक्षित व्यवहार है?

एकाधिक वर्टेक्स बफ़र - एक सूचकांक बफर और सूचकांक बफर केवल एक त्रिकोण के एक बिंदु के लिए एक एकल सूचकांक हो सकती है?

कि वास्तव में सिर्फ मेरे लिए कोई मतलब नहीं है।

सहायता!

+0

हे भगवान, मुझे कभी नहीं पता था कि आप अपने कशेरुक डेटा को इस तरह विभाजित कर सकते हैं! – Lucius

+0

मुझे एक ही समस्या पहले से बहुत पहले नहीं थी और समाधान के दौरान खोज करते समय मैं [इस उत्तर] में आया (http://stackoverflow.com/a/2305383/1798046)। यह वास्तव में मुझे समस्या में और अधिक अंतर्दृष्टि प्राप्त करने में मदद की। मैं भी आपकी मदद कर सकता हूँ। – Krienie

उत्तर

2

बहुत पहली बात यह है कि मेरे सिर में आता है:

सभी हार्डवेयर कि गणना shaders (लगभग सभी DirectX 10 और उच्च के बराबर) का समर्थन करता है भी ByteAddressBuffer रों का समर्थन करता है और इसमें से अधिकांश StructuredBuffer रों का समर्थन करता है। तो तुम SRV रों के रूप में अपने सरणियों बाँध और shaders में उसके तत्वों में से किसी को रैंडम एक्सेस कर सकते हैं।

कुछ इस तरह (परीक्षण नहीं किया, बस स्यूडोकोड):

// Indices passed as vertex buffer to shader 
// Think of them as of "references" to real data 
struct VS_INPUT 
{ 
    uint posidx; 
    uint noridx; 
    uint texidx; 
} 

// The real vertex data 
// You pass it as structured buffers (similar to textures) 
StructuredBuffer<float3> pos : register (t0); 
StructuredBuffer<float3> nor : register (t1); 
StructuredBuffer<float2> tex : register (t2); 


VS_OUTPUT main(VS_INPUT indices) 
{ 
    // in shader you read data for current vertex 
    float3 pos = pos[indices.posidx]; 
    float3 nor = nor[indices.noridx]; 
    float2 tex = tex[indices.texidx]; 

    // here you do something 
} 

की है कि "गणना शेडर दृष्टिकोण" कहते हैं। आपको डायरेक्टएक्स 11 एपीआई का उपयोग करना होगा।

इसके अलावा, आप एक ही फैशन में अपने सूचकांक बाँध और shaders में कुछ जादू कर सकते हैं। इस मामले में आपको वर्तमान इंडेक्स आईडी पता लगाना होगा। शायद आप इसे SV_VertexId से ले जा सकते हैं।

और शायद आप इन बफरों को कामकाज कर सकते हैं और डेटा को किसी भी तरह से बांध सकते हैं (डायरेक्टएक्स 9 संगत बनावट नमूनाकरण! ओ_ओ)।

उम्मीद है कि यह मदद करता है!

+0

यह एक दिलचस्प कामकाज है, मुझे इसे आज़मा देना होगा। मुझे प्रति जाल आधार पर इसे स्थापित करने के प्रदर्शन पहलुओं को देखने में दिलचस्पी होगी। धन्यवाद – WTH

संबंधित मुद्दे