问:DX12在创建图形管线状态时出错

问题描述

按照Microsoft文档并创建PSO,我收到以下D3D12错误

Error code

考虑到第一个错误,说明编码的签名大小与指定的大小不匹配。 我比较了着色器和签名。

    D3D12_INPUT_ELEMENT_DESC inputElementDesc[] =
    {{
      "POSITION",dxgi_FORMAT_R32G32B32_FLOAT,D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA,0
    }};

    D3D12_INPUT_LAYOUT_DESC inputLayoutDesc;
    inputLayoutDesc.pInputElementDescs = inputElementDesc;
    inputLayoutDesc.NumElements = ARRAYSIZE(inputElementDesc);
struct VSIn 
{
    float3 pos : POSITION;
};

struct VSOut
{
    float4 pos : SV_POSITION;
};

VSOut vs_main( VSIn input,uint index : SV_VertexID )
{
    VSOut output = (VSOut)0;
    output.pos = float4(input.pos,1.0f);
    return output;
}

我似乎找不到任何不当行为。 因此,我认为可能是我的着色器编译方式有问题。 为此,我使用了IdxcCompiler库。 调试时,编译没有任何错误

    ComPtr<IDxcoperationResult> result = nullptr;
    ComPtr<IdxcBlobEncoding> vertexBlob = nullptr;
    std::vector<LPCWSTR> compileArguments;
    compileArguments.push_back(L"/Gis");
    ThrowIfFailed(library->CreateBlobFromFile(L"VertexShader.hlsl",nullptr,&vertexBlob));
    ThrowIfFailed(compiler->Compile(
        vertexBlob.Get(),L"VertexShader.hlsl",L"vs_main",L"vs_6_4",compileArguments.data(),(UINT)compileArguments.size(),NULL,&result
    ));

并且斑点似乎已收到其信息

D3D12_GRAPHICS_PIPELINE_STATE_DESC gPipelinestateDesc;
gPipelinestateDesc.pRootSignature = this->gRootSignature.Get();
gPipelinestateDesc.InputLayout = inputLayoutDesc;
gPipelinestateDesc.PrimitivetopologyType = D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE;

ComPtr<IdxcBlobEncoding> test16;
gPipelinestateDesc.VS.pShaderBytecode = reinterpret_cast<void*>(vertexBlob->GetBufferPointer());
library->GetBlobAsUtf16(vertexBlob.Get(),&test16);
OutputDebugStringW(reinterpret_cast<LPCWSTR>(test16->GetBufferPointer()));
gPipelinestateDesc.VS.BytecodeLength = vertexBlob->GetBufferSize();

gPipelinestateDesc.RTVFormats[0] = dxgi_FORMAT_R8G8B8A8_UnorM;
gPipelinestateDesc.Numrendertargets = 1;
gPipelinestateDesc.SampleDesc.Count = 1;
gPipelinestateDesc.SampleMask = UINT_MAX;

gPipelinestateDesc.RasterizerState.FillMode = D3D12_FILL_MODE_SOLID;
gPipelinestateDesc.RasterizerState.CullMode = D3D12_CULL_MODE_BACK;

D3D12_RENDER_TARGET_BLEND_DESC RTBlendDesc = {
    false,false,D3D12_BLEND_ONE,D3D12_BLEND_ZERO,D3D12_BLEND_OP_ADD,D3D12_LOGIC_OP_NOOP,D3D12_COLOR_WRITE_ENABLE_ALL
};
for (UINT i = 0; i < D3D12_SIMULTANEOUS_RENDER_TARGET_COUNT; ++i)
{
    gPipelinestateDesc.BlendState.rendertarget[i] = RTBlendDesc;
}
ThrowIfFailed(this->gDevice->CreateGraphicsPipelinestate(&gPipelinestateDesc,IID_PPV_ARGS(&this->gPipelinestate)));

Output Results

缓冲区大小/字节代码长度为241个字节。 有谁知道哪里出了问题?

解决方法

查克·沃尔本(Chuck Walbourn)帮助我找到了解决方案。 Blob无法通过类似于D3DCompileFromFile()的编译获得结果。 通过在编译器的最后一个参数中使用IDxcOperationResult。 您正在像这样从编译器获取结果:

wg.Done()

通过这种方式-> GetBufferPointer()应该可以正常工作。 其余错误是由于忘记使用“ = {};”初始化管道状态描述所致。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...