运行时出现hr failed:md3dDevice->CreateCommittedResource(&CD3DX12 HEAP PROPERTIES(D3D12 HEAP TYPE UPLOAD), D3D12_HEAP_FLAG_NONE, &CD3DX12_RESOURCE_DESC::Buffer(vertexBufferSize), D3D12_RESOURCE_STATE_GENERIC_READ, nullptr, IID_PPV_ARGS(&mVertexBuffer)) failed inC:\Users\……\test\InitDirect3DApp.cpp; 线244;错误。 参数错误。
当 md3dDevice->CreateCommittedResource
调用失败并返回 “参数错误” 时,通常是由于传递给该函数的参数存在问题。下面为你分析可能的原因及相应的解决办法:
1. 顶点缓冲区大小问题
若 vertexBufferSize
的值无效(比如为 0),就会引发创建资源失败。你可以添加一些调试输出,确认 vertexBufferSize
的值是否正确。
void InitDirect3DApp::CreateVertexBuffer()
{
// 创建顶点缓冲区资源
UINT vertexBufferSize = sizeof(Vertex) * mVertices.size();
if (vertexBufferSize == 0) {
std::cerr << "Vertex buffer size is zero!" << std::endl;
}
std::cout << "Vertex buffer size: " << vertexBufferSize << std::endl;
ThrowIfFailed(md3dDevice->CreateCommittedResource(
&CD3DX12_HEAP_PROPERTIES(D3D12_HEAP_TYPE_UPLOAD),
D3D12_HEAP_FLAG_NONE,
&CD3DX12_RESOURCE_DESC::Buffer(vertexBufferSize),
D3D12_RESOURCE_STATE_GENERIC_READ,
nullptr,
IID_PPV_ARGS(&mVertexBuffer)));
// ...
}
2. 设备初始化问题
若 md3dDevice
未正确初始化,调用 CreateCommittedResource
时就会失败。你要确保 md3dDevice
在调用此函数之前已经成功创建。
bool InitDirect3DApp::Initialize()
{
if (!D3DApp::Initialize())
return false;
if (md3dDevice == nullptr) {
std::cerr << "Device is not initialized!" << std::endl;
return false;
}
// ...
}
3. 内存对齐问题
虽然在创建常量缓冲区时需要进行内存对齐,但顶点缓冲区通常不需要。不过,还是要确保传递的大小和偏移量是有效的。
4. 堆类型和资源状态问题
D3D12_HEAP_TYPE_UPLOAD
和 D3D12_RESOURCE_STATE_GENERIC_READ
通常是用于上传缓冲区的正确设置,但还是要确保这些设置与你的需求相符。
5. 模型加载问题
如果模型加载失败,mVertices
可能为空,这会导致 vertexBufferSize
为 0。你可以在 LoadModel
函数中添加调试输出,确认模型是否正确加载。
void InitDirect3DApp::LoadModel(const std::string& filePath)
{
Assimp::Importer importer;
const aiScene* scene = importer.ReadFile(filePath, aiProcess_Triangulate | aiProcess_ConvertToLeftHanded);
if (!scene || scene->mFlags & AI_SCENE_FLAGS_INCOMPLETE || !scene->mRootNode)
{
std::cerr << "Error loading model: " << importer.GetErrorString() << std::endl;
return;
}
for (unsigned int i = 0; i < scene->mNumMeshes; ++i)
{
aiMesh* mesh = scene->mMeshes[i];
for (unsigned int j = 0; j < mesh->mNumVertices; ++j)
{
Vertex vertex;
vertex.x = mesh->mVertices[j].x;
vertex.y = mesh->mVertices[j].y;
vertex.z = mesh->mVertices[j].z;
mVertices.push_back(vertex);
}
}
std::cout << "Number of vertices loaded: " << mVertices.size() << std::endl;
}