问题描述
刚开始接触Directx 12,按照龙书自学到第七章。现在根据LandAndWave程序自己动手实现,但是发现自己写的程序给变量赋值部分不能和书中保持一直,导致做不出理想的效果。
具体内容是在创建渲染项部分给ComPtr<ID3D10Blob> VertexBufferCPU
和ComPtr<ID3D12Resource> VertexBufferGPU
赋值的长度(8位)与书中(16位)不一样,但是代码实现部分完全一样。这导致渲染的时候读不出数据没有内容可展示。
问题出现的平台版本及自己尝试过哪些方法
编译环境:
SDK版本 Windows SDK 10.0.17763.0
显卡 NVIDIA GTX 1060
IDE VS2017
相关代码
申明部分
struct MeshGeometry
{
std::string Name;
ComPtr<ID3DBlob> VertexBufferCPU = nullptr;
ComPtr<ID3DBlob> IndexBufferCPU = nullptr;
ComPtr<ID3D12Resource> VertexBufferGPU = nullptr;
ComPtr<ID3D12Resource> IndexBufferGPU = nullptr;
ComPtr<ID3D12Resource> VertexBufferUpload = nullptr;
ComPtr<ID3D12Resource> IndexBufferUpload = nullptr;
UINT VertexBufferByteSize = 0;
UINT VertexBufferStride = 0;
UINT IndexBufferByteSize = 0;
DXGI_FORMAT IndexFormat = DXGI_FORMAT_R16_UINT;
std::unordered_map<std::string, SubmeshGeometry> DrawArgs;
D3D12_VERTEX_BUFFER_VIEW getVertexBufferView()
{
D3D12_VERTEX_BUFFER_VIEW vbv;
vbv.BufferLocation = VertexBufferGPU->GetGPUVirtualAddress();
vbv.SizeInBytes = VertexBufferByteSize;
vbv.StrideInBytes = VertexBufferStride;
return vbv;
}
D3D12_INDEX_BUFFER_VIEW getIndexBufferView()
{
D3D12_INDEX_BUFFER_VIEW ibv;
ibv.BufferLocation = IndexBufferGPU->GetGPUVirtualAddress();
ibv.Format = IndexFormat;
ibv.SizeInBytes = IndexBufferByteSize;
return ibv;
}
void disposeUpload()
{
VertexBufferUpload = nullptr;
IndexBufferUpload = nullptr;
}
};
初始化部分
auto geo = std::make_unique<MeshGeometry>();
geo->Name = "camp";
D3DCreateBlob(vbByteSize, &geo->VertexBufferCPU);
CopyMemory(geo->VertexBufferCPU->GetBufferPointer(), vertices.data(), vbByteSize);
D3DCreateBlob(ibByteSize, &geo->IndexBufferCPU);
CopyMemory(geo->IndexBufferCPU->GetBufferPointer(), indices.data(), ibByteSize);
geo->VertexBufferGPU = DXUtil::createDefaultBuffer(mDevice.Get(),
mCmdList.Get(), vertices.data(), vbByteSize, geo->VertexBufferUpload);
geo->IndexBufferGPU = DXUtil::createDefaultBuffer(mDevice.Get(),
mCmdList.Get(), indices.data(), ibByteSize, geo->IndexBufferUpload);
你期待的结果是什么?实际看到的错误信息又是什么?
DEBUG时候发现Buffer的数据长度不一样,最后没有渲染效果。
自己运行的结果![]()
正确的结果![]()