DirectX 11映射deviceContext失败

时间:2016-04-20 19:47:09

标签: visual-studio directx

我有一个应用程序可以渲染一个立方体并做一些其他的syuff。但不幸的是,当我想用​​鼠标移动一些顶点时。我有一个错误。当我映射顶点缓冲区时,另一个结构数组中记录的顶点为空。为了测试我的应用程序,我只是在创建vertexbuffer后放置一个地图,以查看调试器是否显示实数。它也失败了。一切都填充了0.00值(位置,法线,切线......)。问题是什么? 在这里你可以找到代码。

D3D11_BUFFER_DESC bd;
ZeroMemory( &bd, sizeof(bd) );
bd.Usage = D3D11_USAGE_DYNAMIC; //D3D11_USAGE_DEFAULT; //D3D11_USAGE_DYNAMIC;// D3D11_USAGE_DEFAULT;
bd.ByteWidth = CBSize( sizeof( VERTEX_PNTTB)* NumVertices);
bd.BindFlags = D3D11_BIND_VERTEX_BUFFER;
bd.CPUAccessFlags =  D3D11_CPU_ACCESS_WRITE; // 0; // D3D11_CPU_ACCESS_READ; //D3D11_CPU_ACCESS_WRITE; // 0;
bd.StructureByteStride = 0;
bd.MiscFlags =  0;
//bd.StructureByteStride
//bd.MiscFlags = 0;
D3D11_SUBRESOURCE_DATA InitData;
ZeroMemory( &InitData, sizeof(InitData) );
InitData.pSysMem = (void*)vertices; //(void*)(mesh->GetVertexes().data()); //vertices; //(float*)vertices; // (UINT*)vertices;
InitData.SysMemPitch=0;
ID3D11Buffer* vbuff = NULL;
hr = device->CreateBuffer(&bd, &InitData, &vbuff); // &(m->vertexBuffer)); //&m_pVertexBuffer );
//if( FAILED( hr ) )
//  return hr;
//}
m->vertexBuffer = vbuff;


    D3D11_MAPPED_SUBRESOURCE mappedResource;
    ID3D11Buffer* &buff = vbuff;
    //g_pImmediateContext->CopyResource(buff, mElements[ 0 ]->getElement().model ->Meshes()[selectedMeshIndex]->VertexBuffer());
    hr = g_pImmediateContext->Map( buff, 0, D3D11_MAP_WRITE_DISCARD ,0, &mappedResource); // D3D11_MAP_WRITE_DISCARD, 0, &mappedResource);
    if (SUCCEEDED(hr))
    {
        VERTEX_PNTTB *vertices = (VERTEX_PNTTB *)mappedResource.pData;
        // Fill vertex buffer
        //vertices[0].position = vertices[0]; // XMFLOAT3(toX0,toY0,0); //-1;//toX0; //-1;//vf1.x; // x0;
        /*for(UINT i=0; i<faces_indices.size(); i++)
        {
            vertices[ faces_indices[i] ].position.x = vertices[faces_indices[i] ].position.x + DirectX::XMFLOAT3(20*dx,20*dy,0).x;
            vertices[ faces_indices[i] ].position.y = vertices[faces_indices[i] ].position.y + DirectX::XMFLOAT3(20*dx,20*dy,0).y;
            vertices[ faces_indices[i] ].position.z = vertices[faces_indices[i] ].position.z + DirectX::XMFLOAT3(20*dx,20*dy,0).z;

        }*/

        //g_pImmediateContext->Unmap( mElements[ 0 ]->getElement().model ->Meshes()[selectedMeshIndex]->VertexBuffer(), 0);
        g_pImmediateContext->Unmap( buff, 0);
    }

1 个答案:

答案 0 :(得分:2)

通常,您不希望在CPU可读内存中创建顶点缓冲区或索引缓冲区,因为它会对性能产生重大负面影响。您会发现在标准RAM中使用静态VB / IB和另一个数据副本以便CPU进行修改会更好。

也就是说,可以使用D3D11_USAGE_DYNAMICD3D11_CPU_ACCESS_READ | D3D11_CPU_ACCESS_WRITE 在共享内存中创建Direct3D 11缓冲区。然后,您使用Map致电D3D11_MAP_READ_WRITE

你绝对应该使用D3D11_MAP_WRITE_DISCARD,它会为你提供一个没有数据的新内存,当你调用Unmap时,它会覆盖旧数据。< / p>