c++ - 动态顶点缓冲区创建失败

标签 c++ directx-11

我正在尝试创建一个动态顶点缓冲区,以便我可以使用 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 同时创建顶点缓冲区时才会失败。关于问题是什么的任何想法?

最佳答案

我记得前一段时间遇到过这个问题。正如 MSDN 所说,当您将资源创建为动态资源时,您应该使用 ID3D11DeviceContext::Map() 填充它。哪怕是第一次。因此,当您创建缓冲区时,只需尝试传递 NULL 而不是 &InitData。创建缓冲区后,对其进行映射和填充。据我所知,这解决了我的问题。这是来源。

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

关于c++ - 动态顶点缓冲区创建失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25589346/

相关文章:

c++ - 包含 DirectXTex.h 时出错

hlsl - 如何将几何着色器与输出流结合使用?

c++ - DirectX11 2 窗口渲染

c++ - 使用 cvflann::anyimpl::bad_any_cast 在 iOS 上拼接全景图会崩溃

c++ - 静态函数接收到错误的参数

c++ - 如何正确初始化模板类型的成员变量?

c++ - 尝试渲染 3d 三角形会破坏 Nvidia 驱动程序!为什么? [C++ && DirectX11 SDK]

c++ - 如何使用 CMake 正确添加包含目录

c++ - C++修改const指针引用值

c++ - 每个实例具有不同索引计数的 DrawIndexedInstanced (Directx11)