2011-07-16 6 views
5

मैं अभी डायरेक्ट 3 डी 11 का उपयोग करना शुरू कर रहा हूं और मैं एक गतिशील बनावट बनाने की कोशिश कर रहा हूं जिसे मैं कई बार एक बार नए डेटा के साथ अपडेट करने की योजना बना रहा हूं। मेरी समस्या यह है कि हर बार जब मैं नए डेटा के साथ बनावट को अद्यतन करता हूं, तो मुझे यह त्रुटि D3D डीबगर से प्राप्त होती है:"पहले से मैप किए गए त्रुटि" के कारण गतिशील बनावट मैपिंग

D3D11: त्रुटि: ID3D11DeviceContext :: मानचित्र: यह संसाधन पहले ही मैप किया गया है! [RESOURCE_MANIPULATION ERROR # 2097213: RESOURCE_MAP_ALREADYMAPPED]

जो अंततः एप्लिकेशन को चलाने के बाद मानचित्र कॉल से E_OUTOFMEMORY त्रुटि में बदल जाता है। इस तरह

D3D11_TEXTURE2D_DESC td; 
td.ArraySize = 1; 
td.BindFlags = D3D11_BIND_SHADER_RESOURCE; 
td.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; 
td.Format = DXGI_FORMAT_B8G8R8X8_UNORM; 
td.Height = height; 
td.Width = width; 
td.MipLevels = 1; 
td.MiscFlags = 0; 
td.SampleDesc.Count = 1; 
td.SampleDesc.Quality = 0; 
td.Usage = D3D11_USAGE_DYNAMIC; 

HR(m_device->CreateTexture2D(&td, 0, &texture)); 

और अद्यतन करने के अपने डेटा::

मैं इस तरह मेरी बनावट बनाने रहा

HR(m_deviceContext->Map(texture, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource)); 
BYTE* mappedData = reinterpret_cast<BYTE*>(mappedResource.pData); 
for(UINT i = 0; i < height; ++i) 
{ 
    memcpy(mappedData, buffer,rowspan); 
    mappedData += mappedResource.RowPitch; 
    buffer += rowspan; 
} 
m_deviceContext->Unmap(texture, 0); 

इससे पहले कि मैं बनावट बना सकते हैं और इसे करने के लिए डेटा को मैप, सब मैं में किया है मेरा प्रोग्राम डायरेक्ट 3 डी डिवाइस शुरू कर रहा है। मैं पूरी तरह से स्टंप कर रहा हूं कि मैं क्या गलत कर रहा हूं। मैं इस बारे में msdn पर जितना भी कर सकता हूं उसे पढ़ने की कोशिश कर रहा हूं लेकिन कुछ भी गलत होने में मुझे यह जानने में मदद नहीं मिली है। MSDN के अनुसार, मैं उचित कदम के लिए ले रहा हूँ:

http://msdn.microsoft.com/en-us/library/ff476905(v=vs.85).aspx#Dynamic

To fill a dynamic texture (one created with D3D11_USAGE_DYNAMIC): 
Get a pointer to the texture memory by passing in D3D11_MAP_WRITE_DISCARD when calling    
ID3D11DeviceContext::Map. 
Write data to the memory. 
Call ID3D11DeviceContext::Unmap when you are finished writing data. 

मैं काफी कुछ मैं बनावट विवरण को भरना है सही ढंग से भी कर रहा हूँ।

क्या समस्या मेरे d3d उपकरणों के प्रारंभिकरण से हो सकती है? क्या मैं नक्शा समारोह का दुरुपयोग कर रहा हूं? क्या मैंने पर्याप्त पृष्ठभूमि जानकारी प्रदान नहीं की? क्या चल रहा है पर कोई विचार?

अतिरिक्त जानकारी: जब मैं अपने वर्टेक्स शेडर के लिए निरंतर बफर में डेटा मैप करने का प्रयास करता हूं तो मुझे वही "संसाधन पहले ही मैप किया गया" त्रुटि मिलती है। इसके अलावा, मैंने इसे एक अलग कंप्यूटर पर परीक्षण किया और उसी मैपिंग समस्याएं प्राप्त कीं।

अद्यतन: मैंने डी 3 डी 11 के लिए कुछ ट्यूटोरियल कोड डाउनलोड किया और मैंने अपना बनावट निर्माण और मैपिंग कोड लिया और ट्यूटोरियल कोड d3d प्रारंभ करने के बाद इसे ठीक से फिसल गया। मैं बस देखना चाहता था कि मुझे मैपिंग त्रुटि मिल जाएगी या नहीं। जैसा कि अपेक्षित था, मुझे "संसाधन पहले ही मैप किया गया" त्रुटि नहीं मिली। इसके अलावा, जब मैं ट्यूटोरियल से d3d प्रारंभिक कोड कॉपी करता हूं और इसे मेरे साथ बदलता हूं, तो मुझे अभी भी संसाधन पहले ही मैप की गई त्रुटि मिलती है जो मुझे और भी भ्रमित करती है क्योंकि डी 3 डी शुरू करने से पहले मैं जो कुछ करता हूं वह एक विंडो बनाता है।

उत्तर

2

यह मजाकिया है कि जब आप अपने अटक गए किसी चीज़ के बारे में प्रश्न पूछना शुरू करते हैं, तो समस्या को ढूंढना आसान हो जाता है।

मुझे पता चला कि समस्या क्या थी। यह मेरा एचआर मैक्रो था कि मैं मानचित्र कॉल के आस-पास था।

#define HR(x)             
{                
    HRESULT hr = (x);           
    if(FAILED(x))            
    {               
     DXTrace(__FILE__, (DWORD)__LINE__, hr, L#x, true); 
    }              
} 

मुझे पता नहीं है कारण है कि यह समस्या के मूल होगा, लेकिन मैं निश्चित रूप से जानते हैं कि कैसे इस मैक्रो मानचित्र कॉल के साथ इस मुद्दे के लिए होता है करना चाहते हैं।

+4

समस्या यह है कि आप दो बार फ़ंक्शन चला रहे हैं। आपको यह करना चाहिए: HRESULT घंटा = (x); अगर (FAILED (घंटा)) – notabene

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