directx12 3d开发过程中出现的报错 六

运行时出现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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云缘若仙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值