2011-07-16 31 views
5

Tôi chỉ mới bắt đầu sử dụng Direct3D11 và tôi đang cố gắng tạo kết cấu động mà tôi dự định cập nhật với dữ liệu mới vài lần một giây. Vấn đề của tôi là mỗi khi tôi cập nhật kết cấu với dữ liệu mới, tôi nhận được lỗi này từ Trình gỡ lỗi D3D:Lập bản đồ kết cấu động gây ra lỗi "Đã lập bản đồ"

D3D11: ERROR: ID3D11DeviceContext :: Bản đồ: Tài nguyên này đã được ánh xạ! [RESOURCE_MANIPULATION ERROR # 2097213: RESOURCE_MAP_ALREADYMAPPED]

Cuối cùng biến thành lỗi E_OUTOFMEMORY từ cuộc gọi bản đồ sau khi chạy ứng dụng trong một thời gian.

tôi đang tạo ra kết cấu của tôi như thế này:

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)); 

và cập nhật dữ liệu của nó như thế này:

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); 

Trước khi tôi tạo ra các kết cấu và lập bản đồ các dữ liệu vào nó, tất cả những gì đã làm trong chương trình của tôi là khởi tạo các thiết bị Direct3D. Tôi hoàn toàn bối rối về những gì tôi đang làm sai. Tôi đã cố gắng đọc nhiều như tôi có thể trên msdn về điều này nhưng không có gì đã giúp tôi tìm ra những gì đang xảy ra sai. Theo MSDN, tôi đang thực hiện để bước thích hợp:

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. 

Tôi khá chắc chắn tôi đã điền vào mô tả kết cấu một cách chính xác quá.

Sự cố có thể xuất phát từ việc khởi tạo thiết bị d3d của tôi không? Tôi có sử dụng sai chức năng bản đồ không? Tôi không cung cấp đủ thông tin cơ bản phải không? Bất kỳ ý tưởng về những gì đang xảy ra?

Thông tin bổ sung: Tôi nhận được cùng một lỗi "tài nguyên đã được ánh xạ" khi tôi cố gắng ánh xạ dữ liệu đến bộ đệm liên tục cho trình đổ bóng đỉnh của tôi. Ngoài ra, tôi đã thử nghiệm nó trên một máy tính khác và có cùng các vấn đề về ánh xạ.

Cập nhật: Tôi đã tải xuống một số mã hướng dẫn cho D3D11 và tôi đã tạo mã bản đồ và tạo bản đồ của mình và plopped nó ngay sau khi mã hướng dẫn hoàn tất khởi tạo d3d. Tôi chỉ muốn xem liệu tôi có bị lỗi lập bản đồ hay không. Theo dự kiến, tôi đã không nhận được lỗi "tài nguyên đã được ánh xạ". Hơn nữa, khi tôi sao chép mã khởi tạo d3d từ hướng dẫn và thay thế nó bằng của tôi, tôi vẫn nhận được tài nguyên đã được ánh xạ lỗi thậm chí còn làm tôi bối rối hơn nữa bởi vì tất cả những gì tôi làm trước khi khởi tạo d3d là tạo một cửa sổ.

Trả lời

2

Điều thú vị của nó khi bạn bắt đầu đặt câu hỏi về điều gì đó mà bạn gặp khó khăn, việc tìm haha ​​vấn đề trở nên dễ dàng hơn.

Tôi đã tìm ra vấn đề là gì. Đó là macro nhân sự của tôi mà tôi đã xung quanh cuộc gọi bản đồ.

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

Tôi không biết tại sao nó lại là gốc của vấn đề, nhưng tôi chắc chắn muốn biết macro này sẽ gặp vấn đề gì với cuộc gọi Bản đồ.

+4

Vấn đề là bạn đang chạy hàm hai lần. Bạn nên làm điều đó: HRESULT hr = (x); nếu (FAILED (hr)) – notabene

Các vấn đề liên quan