2014-08-31 118 views
1

我想创建一个动态顶点缓冲区,以便我可以使用ID3D11DeviceContext :: Map()写入缓冲区。但是,每次我尝试创建顶点缓冲区时,都会失败。这是我的代码。我在其他项目中成功完成了这个任务,所以我不知道为什么我写的东西没有工作。下面是代码:动态顶点缓冲区创建失败

//create vertex buffer 
    Vertex* vertices = static_cast<Vertex*>(std::malloc((4000) * sizeof(Vertex))); 
    for (int i = 0; i < 4000; i++) 
    { 
     vertices[i].pos.x = 0.0f; 
     vertices[i].pos.y = 0.0f; 
     vertices[i].pos.z = 0.0f; 
     vertices[i].tex.x = 0.0f; 
     vertices[i].tex.y = 0.0f; 
    } 
    D3D11_BUFFER_DESC bd; 
    ZeroMemory(&bd, sizeof(bd)); 
    bd.Usage = D3D11_USAGE_DYNAMIC; 
    bd.ByteWidth = sizeof(Vertex) * 4000; 
    bd.BindFlags = D3D11_BIND_VERTEX_BUFFER; 
    bd.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; 
    D3D11_SUBRESOURCE_DATA InitData; 
    ZeroMemory(&InitData, sizeof(InitData)); 
    InitData.pSysMem = vertices; 
    HRESULT hr = Device->CreateBuffer(&bd, &InitData, &VertexBuffer); 

    std::free(vertices); 

与代码乱搞之后,我发现这个代码成功:

//create vertex buffer 
    Vertex* vertices = static_cast<Vertex*>(std::malloc((4000) * sizeof(Vertex))); 
    for (int i = 0; i < 4000; i++) 
    { 
     vertices[i].pos.x = 0.0f; 
     vertices[i].pos.y = 0.0f; 
     vertices[i].pos.z = 0.0f; 
     vertices[i].tex.x = 0.0f; 
     vertices[i].tex.y = 0.0f; 
    } 
    D3D11_BUFFER_DESC bd; 
    ZeroMemory(&bd, sizeof(bd)); 
    bd.Usage = D3D11_USAGE_DYNAMIC; 
    bd.ByteWidth = sizeof(Vertex) * 4000; 
    bd.BindFlags = D3D11_BIND_VERTEX_BUFFER; 
    bd.CPUAccessFlags = 0; 
    D3D11_SUBRESOURCE_DATA InitData; 
    ZeroMemory(&InitData, sizeof(InitData)); 
    InitData.pSysMem = vertices; 
    HRESULT hr = Device->CreateBuffer(&bd, &InitData, &VertexBuffer); 

    std::free(vertices); 

此代码还成功:

//create vertex buffer 
    Vertex* vertices = static_cast<Vertex*>(std::malloc((4000) * sizeof(Vertex))); 
    for (int i = 0; i < 4000; i++) 
    { 
     vertices[i].pos.x = 0.0f; 
     vertices[i].pos.y = 0.0f; 
     vertices[i].pos.z = 0.0f; 
     vertices[i].tex.x = 0.0f; 
     vertices[i].tex.y = 0.0f; 
    } 
    D3D11_BUFFER_DESC bd; 
    ZeroMemory(&bd, sizeof(bd)); 
    bd.Usage = D3D11_USAGE_DEFAULT; 
    bd.ByteWidth = sizeof(Vertex) * 4000; 
    bd.BindFlags = D3D11_BIND_VERTEX_BUFFER; 
    bd.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; 
    D3D11_SUBRESOURCE_DATA InitData; 
    ZeroMemory(&InitData, sizeof(InitData)); 
    InitData.pSysMem = vertices; 
    HRESULT hr = Device->CreateBuffer(&bd, &InitData, &VertexBuffer); 

    std::free(vertices); 

这似乎只是失败当bd.Usage = D3D11_USAGE_DYNAMIC和bd.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE时,同时创建顶点缓冲区。关于什么问题的任何想法?

回答

1

我记得前一阵子有这个问题。正如MSDN所说的,当你创建一个动态的资源时,你应该使用ID3D11DeviceContext :: Map()来填充它。即使这是第一次。因此,当您创建缓冲区时,只需尝试传递NULL而不是& InitData。在创建缓冲区之后,映射并填充。据我所知,这解决了我的情况下的问题。这是源代码。

http://msdn.microsoft.com/en-us/library/windows/desktop/ff476899%28v=vs.85%29.aspx

+0

是的,修复它,谢谢。奇怪的是,我从来没有遇到过这个问题。 – 2014-09-01 07:06:04