我有一个应用程序,它呈现一个多维数据集并进行其他一些处理。但不幸的是,当我想用鼠标移动一些顶点的时候。我有个错误。当我映射顶点缓冲区时,记录在另一个struct数组中的顶点为空。为了测试我的应用程序,我只是在创建了顶点缓冲区之后放置了一个映射,以便查看调试器是否显示了真实的数字。它也失败了。所有东西都填充了0.00值(位置、法线、切线.),.What是问题吗?在这里你可以找到密码。
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);
}发布于 2016-04-21 00:05:06
通常,您不希望在CPU可读的内存中创建顶点缓冲区或索引缓冲区,因为它对性能有很大的负面影响。您会发现让CPU修改静态VB/IB和标准RAM中的另一个数据副本要好得多。
也就是说,您可以使用Direct3D和D3D11_CPU_ACCESS_READ | D3D11_CPU_ACCESS_WRITE在共享内存中创建D3D11_CPU_ACCESS_READ | D3D11_CPU_ACCESS_WRITE 11缓冲区。然后用Map调用D3D11_MAP_READ_WRITE。
您肯定应该而不是使用D3D11_MAP_WRITE_DISCARD,它为您提供了一个没有数据的新内存,当您调用Unmap时,该内存将覆盖旧数据。
https://stackoverflow.com/questions/36753752
复制相似问题