CREATEINPUTLAYOUT_INCOMPATIBLEFORMAT

这个error的全称是这样的

D3D11 ERROR: ID3D11Device::CreateInputLayout: Element[1]'s format (UNKNOW) cannot be used with the Input Assembler. [ STATE_CREATION ERROR #153: CREATEINPUTLAYOUT_INCOMPATIBLEFORMAT]

d3d11这个error。。只搜到两个德文的网页也没什么帮助

角色卡在这里了

这个问题卡了我一下午,后来把第一篇德文网页翻译了下,清晰些了

https://qage.in.tum.de/ss2013/?qa=966/error-code-e_invalidarg-calling-pdevice-createinputlayout

这人说他那里报DXXXX的format是深度专用的format我就去跟我的iaElementdesc 发现我这里color的format是unknow

我把编数据时写进去的format改成另外一个不是unknow的虽然报了mismatch的warning但是 好多了 能显示出东西了 

继场景之后,人物又取得了突破性进展

后来改成mismatch的warning了

这个问题修好了,skinindices shader里面用uint4 对应format用 DXGI_FORMAT_R8G8B8A8_UINT

ID3D11Device::CreateInputLayout: The provided input signature expects to read an element with SemanticName/Index: 'COLOR'/0 and component(s) of the type 'int32'.  However, the matching entry in the Input Layout declaration, element[2], specifies mismatched format: 'R32_UINT'.  

转载于:https://www.cnblogs.com/minggoddess/p/4155352.html

好的,以下是一个简单的数据转换代码,用于将 glTF 模型中的 `(position, normal, tangent, texcoord)` 顶点数据转换为 DirectX 12 中的 `(position, normal, tangent, texcoord)` 输入布局: ```cpp // 定义顶点结构体 struct Vertex { DirectX::XMFLOAT3 position; DirectX::XMFLOAT3 normal; DirectX::XMFLOAT3 tangent; DirectX::XMFLOAT2 texcoord; }; // 读取 glTF 中的四个 bufferView,将数据转换为 Vertex 结构体的形式 std::vector<Vertex> vertices; for (size_t i = 0; i < num_vertices; ++i) { Vertex vertex; vertex.position = DirectX::XMFLOAT3(position_ptr[i * 3], position_ptr[i * 3 + 1], position_ptr[i * 3 + 2]); vertex.normal = DirectX::XMFLOAT3(normal_ptr[i * 3], normal_ptr[i * 3 + 1], normal_ptr[i * 3 + 2]); vertex.tangent = DirectX::XMFLOAT3(tangent_ptr[i * 3], tangent_ptr[i * 3 + 1], tangent_ptr[i * 3 + 2]); vertex.texcoord = DirectX::XMFLOAT2(texcoord_ptr[i * 2], texcoord_ptr[i * 2 + 1]); vertices.push_back(vertex); } // 创建顶点缓冲区 ComPtr<ID3D12Resource> vertexBuffer; D3D12_HEAP_PROPERTIES heapProps = CD3DX12_HEAP_PROPERTIES(D3D12_HEAP_TYPE_DEFAULT); D3D12_RESOURCE_DESC bufferDesc = CD3DX12_RESOURCE_DESC::Buffer(vertices.size() * sizeof(Vertex)); ThrowIfFailed(device->CreateCommittedResource(&heapProps, D3D12_HEAP_FLAG_NONE, &bufferDesc, D3D12_RESOURCE_STATE_COPY_DEST, nullptr, IID_PPV_ARGS(&vertexBuffer))); // 将顶点数据写入到顶点缓冲区中 UINT8* mappedData = nullptr; ThrowIfFailed(vertexBuffer->Map(0, nullptr, reinterpret_cast<void**>(&mappedData))); memcpy(mappedData, vertices.data(), vertices.size() * sizeof(Vertex)); vertexBuffer->Unmap(0, nullptr); // 定义输入布局 const D3D12_INPUT_ELEMENT_DESC inputLayout[] = { { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, offsetof(Vertex, position), D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0 }, { "NORMAL", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, offsetof(Vertex, normal), D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0 }, { "TANGENT", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, offsetof(Vertex, tangent), D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0 }, { "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, offsetof(Vertex, texcoord), D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0 } }; // 创建输入布局 ComPtr<ID3D12InputLayout> inputLayoutObj; ThrowIfFailed(device->CreateInputLayout(inputLayout, _countof(inputLayout), vertexShader->GetBufferPointer(), vertexShader->GetBufferSize(), &inputLayoutObj)); // 绑定顶点缓冲区和输入布局 D3D12_VERTEX_BUFFER_VIEW vertexBufferView = {}; vertexBufferView.BufferLocation = vertexBuffer->GetGPUVirtualAddress(); vertexBufferView.StrideInBytes = sizeof(Vertex); vertexBufferView.SizeInBytes = vertices.size() * sizeof(Vertex); commandList->IASetVertexBuffers(0, 1, &vertexBufferView); commandList->IASetInputLayout(inputLayoutObj.Get()); ``` 这段代码中,首先将 glTF 中的 `(position, normal, tangent, texcoord)` 顶点数据读取出来,然后将它们按照 `Vertex` 结构体的顺序重新排列,并写入到新的顶点缓冲区中。接着,定义了输入布局的描述信息,并通过 `CreateInputLayout` 函数创建输入布局对象。最后,将顶点缓冲区和输入布局绑定到渲染管线上。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值