在添加渲染阴影的代码时,我遇到了一个问题。
在输出视图选择的调试中, 弹出以下错误信息:
这是我添加的着色器代码。
struct VS_LIGHTING_INPUT
{
float3 position : POSITION;
float3 normal : NORMAL;
};
struct VS_LIGHTING_OUTPUT
{
float4 position : SV_POSITION;
float3 positionW : POSITION;
float3 normalW : NORMAL;
};
VS_LIGHTING_OUTPUT VSLighting(VS_LIGHTING_INPUT input)
{
VS_LIGHTING_OUTPUT output;
output.normalW = mul(input.normal, (float3x3)gmtxGameObject);
output.positionW = (float3)mul(float4(input.position, 1.0f), gmtxGameObject);
output.position = mul(mul(float4(output.positionW, 1.0f), gmtxView), gmtxProjection);
return(output);
}
float4 PSLighting(VS_LIGHTING_OUTPUT input) : SV_TARGET
{
input.normalW = normalize(input.normalW);
float4 uvs[MAX_SHADOW_LIGHTS];
float4 cIllumination = shadowLighting(input.positionW, input.normalW, false, uvs);
// return(cIllumination);
return(float4(input.normalW * 0.5f + 0.5f, 1.0f));
}
//==================================================================================================
struct PS_DEPTH_OUTPUT
{
float fzPosition : SV_Target;
float fDepth : SV_Depth;
};
PS_DEPTH_OUTPUT PSDepthWriteShader(VS_LIGHTING_OUTPUT input)
{
PS_DEPTH_OUTPUT output;
output.fzPosition = input.position.z;
output.fDepth = input.position.z;
return(output);
}
//==================================================================================================
struct VS_SHADOW_MAP_OUTPUT
{
float4 position : SV_POSITION;
float3 positionW : POSITION;
float3 normalW : NORMAL;
float4 uvs[MAX_SHADOW_LIGHTS] : TEXCOORD0;
};
VS_SHADOW_MAP_OUTPUT VSShadowMapShadow(VS_LIGHTING_INPUT input)
{
VS_SHADOW_MAP_OUTPUT output = (VS_SHADOW_MAP_OUTPUT)0;
float4 positionW = mul(float4(input.position, 1.0f), gmtxGameObject);
output.positionW = positionW.xyz;
output.position = mul(mul(positionW, gmtxView), gmtxProjection);
output.normalW = mul(float4(input.normal, 0.0f), gmtxGameObject).xyz;
for (int i = 0; i < MAX_SHADOW_LIGHTS; i++)
{
if (gcbToLightSpaces[i].f4Position.w != 0.0f) output.uvs[i] = mul(positionW, gcbToLightSpaces[i].mtxToTexture);
}
return(output);
}
float4 PSShadowMapShadow(VS_SHADOW_MAP_OUTPUT input) : SV_TARGET
{
float4 cIllumination = shadowLighting(input.positionW, normalize(input.normalW), true, input.uvs);
return(cIllumination);
}
根签名设置如下
ID3D12RootSignature* CStage::CreateGraphicsRootSignature(ID3D12Device* pd3dDevice)
{
ID3D12RootSignature* pd3dGraphicsRootSignature = NULL;
D3D12_DESCRIPTOR_RANGE pd3dDescriptorRanges[8];
pd3dDescriptorRanges[0].RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_SRV;
pd3dDescriptorRanges[0].NumDescriptors = 1;
pd3dDescriptorRanges[0].BaseShaderRegister = 6; //t6: gtxtAlbedoTexture
pd3dDescriptorRanges[0].RegisterSpace = 0;
pd3dDescriptorRanges[0].OffsetInDescriptorsFromTableStart = D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND;
pd3dDescriptorRanges[1].RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_SRV;
pd3dDescriptorRanges[1].NumDescriptors = 1;
pd3dDescriptorRanges[1].BaseShaderRegister = 7; //t7: gtxtSpecularTexture
pd3dDescriptorRanges[1].RegisterSpace = 0;
pd3dDescriptorRanges[1].OffsetInDescriptorsFromTableStart = D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND;
pd3dDescriptorRanges[2].RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_SRV;
pd3dDescriptorRanges[2].NumDescriptors = 1;
pd3dDescriptorRanges[2].BaseShaderRegister = 8; //t8: gtxtNormalTexture
pd3dDescriptorRanges[2].RegisterSpace = 0;
pd3dDescriptorRanges[2].OffsetInDescriptorsFromTableStart = D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND;
pd3dDescriptorRanges[3].RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_SRV;
pd3dDescriptorRanges[3].NumDescriptors = 1;
pd3dDescriptorRanges[3].BaseShaderRegister = 9; //t9: gtxtMetallicTexture
pd3dDescriptorRanges[3].RegisterSpace = 0;
pd3dDescriptorRanges[3].OffsetInDescriptorsFromTableStart = D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND;
pd3dDescriptorRanges[4].RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_SRV;
pd3dDescriptorRanges[4].NumDescriptors = 1;
pd3dDescriptorRanges[4].BaseShaderRegister = 10; //t10: gtxtEmissionTexture
pd3dDescriptorRanges[4].RegisterSpace = 0;
pd3dDescriptorRanges[4].OffsetInDescriptorsFromTableStart = D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND;
pd3dDescriptorRanges[5].RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_SRV;
pd3dDescriptorRanges[5].NumDescriptors = 1;
pd3dDescriptorRanges[5].BaseShaderRegister = 11; //t11: gtxtEmissionTexture
pd3dDescriptorRanges[5].RegisterSpace = 0;
pd3dDescriptorRanges[5].OffsetInDescriptorsFromTableStart = D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND;
pd3dDescriptorRanges[6].RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_SRV;
pd3dDescriptorRanges[6].NumDescriptors = 1;
pd3dDescriptorRanges[6].BaseShaderRegister = 12; //t12: gtxtEmissionTexture
pd3dDescriptorRanges[6].RegisterSpace = 0;
pd3dDescriptorRanges[6].OffsetInDescriptorsFromTableStart = D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND;
pd3dDescriptorRanges[7].RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_SRV;
pd3dDescriptorRanges[7].NumDescriptors = MAX_DEPTH_TEXTURES;
pd3dDescriptorRanges[7].BaseShaderRegister = 2; //Depth Buffer
pd3dDescriptorRanges[7].RegisterSpace = 0;
pd3dDescriptorRanges[7].OffsetInDescriptorsFromTableStart = D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND;
D3D12_ROOT_PARAMETER pd3dRootParameters[14];
pd3dRootParameters[0].ParameterType = D3D12_ROOT_PARAMETER_TYPE_CBV;
pd3dRootParameters[0].Descriptor.ShaderRegister = 1; //Camera
pd3dRootParameters[0].Descriptor.RegisterSpace = 0;
pd3dRootParameters[0].ShaderVisibility = D3D12_SHADER_VISIBILITY_ALL;
pd3dRootParameters[1].ParameterType = D3D12_ROOT_PARAMETER_TYPE_32BIT_CONSTANTS;
pd3dRootParameters[1].Constants.Num32BitValues = 33;
pd3dRootParameters[1].Constants.ShaderRegister = 2; //GameObject
pd3dRootParameters[1].Constants.RegisterSpace = 0;
pd3dRootParameters[1].ShaderVisibility = D3D12_SHADER_VISIBILITY_ALL;
pd3dRootParameters[2].ParameterType = D3D12_ROOT_PARAMETER_TYPE_CBV;
pd3dRootParameters[2].Descriptor.ShaderRegister = 4; //Lights
pd3dRootParameters[2].Descriptor.RegisterSpace = 0;
pd3dRootParameters[2].ShaderVisibility = D3D12_SHADER_VISIBILITY_ALL;
pd3dRootParameters[3].ParameterType = D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE;
pd3dRootParameters[3].DescriptorTable.NumDescriptorRanges = 1;
pd3dRootParameters[3].DescriptorTable.pDescriptorRanges = &(pd3dDescriptorRanges[0]);
pd3dRootParameters[3].ShaderVisibility = D3D12_SHADER_VISIBILITY_PIXEL;
pd3dRootParameters[4].ParameterType = D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE;
pd3dRootParameters[4].DescriptorTable.NumDescriptorRanges = 1;
pd3dRootParameters[4].DescriptorTable.pDescriptorRanges = &(pd3dDescriptorRanges[1]);
pd3dRootParameters[4].ShaderVisibility = D3D12_SHADER_VISIBILITY_PIXEL;
pd3dRootParameters[5].ParameterType = D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE;
pd3dRootParameters[5].DescriptorTable.NumDescriptorRanges = 1;
pd3dRootParameters[5].DescriptorTable.pDescriptorRanges = &(pd3dDescriptorRanges[2]);
pd3dRootParameters[5].ShaderVisibility = D3D12_SHADER_VISIBILITY_PIXEL;
pd3dRootParameters[6].ParameterType = D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE;
pd3dRootParameters[6].DescriptorTable.NumDescriptorRanges = 1;
pd3dRootParameters[6].DescriptorTable.pDescriptorRanges = &(pd3dDescriptorRanges[3]);
pd3dRootParameters[6].ShaderVisibility = D3D12_SHADER_VISIBILITY_PIXEL;
pd3dRootParameters[7].ParameterType = D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE;
pd3dRootParameters[7].DescriptorTable.NumDescriptorRanges = 1;
pd3dRootParameters[7].DescriptorTable.pDescriptorRanges = &(pd3dDescriptorRanges[4]);
pd3dRootParameters[7].ShaderVisibility = D3D12_SHADER_VISIBILITY_PIXEL;
pd3dRootParameters[8].ParameterType = D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE;
pd3dRootParameters[8].DescriptorTable.NumDescriptorRanges = 1;
pd3dRootParameters[8].DescriptorTable.pDescriptorRanges = &(pd3dDescriptorRanges[5]);
pd3dRootParameters[8].ShaderVisibility = D3D12_SHADER_VISIBILITY_PIXEL;
pd3dRootParameters[9].ParameterType = D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE;
pd3dRootParameters[9].DescriptorTable.NumDescriptorRanges = 1;
pd3dRootParameters[9].DescriptorTable.pDescriptorRanges = &(pd3dDescriptorRanges[6]);
pd3dRootParameters[9].ShaderVisibility = D3D12_SHADER_VISIBILITY_PIXEL;
pd3dRootParameters[10].ParameterType = D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE;
pd3dRootParameters[10].DescriptorTable.NumDescriptorRanges = 1;
pd3dRootParameters[10].DescriptorTable.pDescriptorRanges = &pd3dDescriptorRanges[7]; //Depth`Buffer
pd3dRootParameters[10].ShaderVisibility = D3D12_SHADER_VISIBILITY_PIXEL;
pd3dRootParameters[11].ParameterType = D3D12_ROOT_PARAMETER_TYPE_CBV;
pd3dRootParameters[11].Descriptor.ShaderRegister = 7; //Skinned Bone Offsets
pd3dRootParameters[11].Descriptor.RegisterSpace = 0;
pd3dRootParameters[11].ShaderVisibility = D3D12_SHADER_VISIBILITY_VERTEX;
pd3dRootParameters[12].ParameterType = D3D12_ROOT_PARAMETER_TYPE_CBV;
pd3dRootParameters[12].Descriptor.ShaderRegister = 8; //Skinned Bone Transforms
pd3dRootParameters[12].Descriptor.RegisterSpace = 0;
pd3dRootParameters[12].ShaderVisibility = D3D12_SHADER_VISIBILITY_VERTEX;
pd3dRootParameters[13].ParameterType = D3D12_ROOT_PARAMETER_TYPE_CBV;
pd3dRootParameters[13].Descriptor.ShaderRegister = 3; //ToLight
pd3dRootParameters[13].Descriptor.RegisterSpace = 0;
pd3dRootParameters[13].ShaderVisibility = D3D12_SHADER_VISIBILITY_ALL;
D3D12_STATIC_SAMPLER_DESC pd3dSamplerDescs[4];
pd3dSamplerDescs[0].Filter = D3D12_FILTER_MIN_MAG_MIP_LINEAR;
pd3dSamplerDescs[0].AddressU = D3D12_TEXTURE_ADDRESS_MODE_WRAP;
pd3dSamplerDescs[0].AddressV = D3D12_TEXTURE_ADDRESS_MODE_WRAP;
pd3dSamplerDescs[0].AddressW = D3D12_TEXTURE_ADDRESS_MODE_WRAP;
pd3dSamplerDescs[0].MipLODBias = 0;
pd3dSamplerDescs[0].MaxAnisotropy = 1;
pd3dSamplerDescs[0].ComparisonFunc = D3D12_COMPARISON_FUNC_ALWAYS;
pd3dSamplerDescs[0].MinLOD = 0;
pd3dSamplerDescs[0].MaxLOD = D3D12_FLOAT32_MAX;
pd3dSamplerDescs[0].ShaderRegister = 0;
pd3dSamplerDescs[0].RegisterSpace = 0;
pd3dSamplerDescs[0].ShaderVisibility = D3D12_SHADER_VISIBILITY_PIXEL;
pd3dSamplerDescs[1].Filter = D3D12_FILTER_MIN_MAG_MIP_LINEAR;
pd3dSamplerDescs[1].AddressU = D3D12_TEXTURE_ADDRESS_MODE_CLAMP;
pd3dSamplerDescs[1].AddressV = D3D12_TEXTURE_ADDRESS_MODE_CLAMP;
pd3dSamplerDescs[1].AddressW = D3D12_TEXTURE_ADDRESS_MODE_CLAMP;
pd3dSamplerDescs[1].MipLODBias = 0;
pd3dSamplerDescs[1].MaxAnisotropy = 1;
pd3dSamplerDescs[1].ComparisonFunc = D3D12_COMPARISON_FUNC_ALWAYS;
pd3dSamplerDescs[1].MinLOD = 0;
pd3dSamplerDescs[1].MaxLOD = D3D12_FLOAT32_MAX;
pd3dSamplerDescs[1].ShaderRegister = 1;
pd3dSamplerDescs[1].RegisterSpace = 0;
pd3dSamplerDescs[1].ShaderVisibility = D3D12_SHADER_VISIBILITY_PIXEL;
pd3dSamplerDescs[2].Filter = D3D12_FILTER_COMPARISON_MIN_MAG_LINEAR_MIP_POINT;
pd3dSamplerDescs[2].AddressU = D3D12_TEXTURE_ADDRESS_MODE_BORDER;
pd3dSamplerDescs[2].AddressV = D3D12_TEXTURE_ADDRESS_MODE_BORDER;
pd3dSamplerDescs[2].AddressW = D3D12_TEXTURE_ADDRESS_MODE_BORDER;
pd3dSamplerDescs[2].MipLODBias = 0.0f;
pd3dSamplerDescs[2].MaxAnisotropy = 1;
pd3dSamplerDescs[2].ComparisonFunc = D3D12_COMPARISON_FUNC_LESS_EQUAL; //D3D12_COMPARISON_FUNC_LESS
pd3dSamplerDescs[2].BorderColor = D3D12_STATIC_BORDER_COLOR_OPAQUE_WHITE; //D3D12_STATIC_BORDER_COLOR_OPAQUE_BLACK;
pd3dSamplerDescs[2].MinLOD = 0;
pd3dSamplerDescs[2].MaxLOD = D3D12_FLOAT32_MAX;
pd3dSamplerDescs[2].ShaderRegister = 2;//
pd3dSamplerDescs[2].RegisterSpace = 0;
pd3dSamplerDescs[2].ShaderVisibility = D3D12_SHADER_VISIBILITY_PIXEL;
pd3dSamplerDescs[3].Filter = D3D12_FILTER_MIN_MAG_MIP_LINEAR;
pd3dSamplerDescs[3].AddressU = D3D12_TEXTURE_ADDRESS_MODE_BORDER;
pd3dSamplerDescs[3].AddressV = D3D12_TEXTURE_ADDRESS_MODE_BORDER;
pd3dSamplerDescs[3].AddressW = D3D12_TEXTURE_ADDRESS_MODE_BORDER;
pd3dSamplerDescs[3].MipLODBias = 0.0f;
pd3dSamplerDescs[3].MaxAnisotropy = 1;
pd3dSamplerDescs[3].ComparisonFunc = D3D12_COMPARISON_FUNC_ALWAYS;
pd3dSamplerDescs[3].BorderColor = D3D12_STATIC_BORDER_COLOR_OPAQUE_BLACK;
pd3dSamplerDescs[3].MinLOD = 0;
pd3dSamplerDescs[3].MaxLOD = D3D12_FLOAT32_MAX;
pd3dSamplerDescs[3].ShaderRegister = 3;//
pd3dSamplerDescs[3].RegisterSpace = 0;
pd3dSamplerDescs[3].ShaderVisibility = D3D12_SHADER_VISIBILITY_PIXEL;
D3D12_ROOT_SIGNATURE_FLAGS d3dRootSignatureFlags = D3D12_ROOT_SIGNATURE_FLAG_ALLOW_INPUT_ASSEMBLER_INPUT_LAYOUT | D3D12_ROOT_SIGNATURE_FLAG_DENY_HULL_SHADER_ROOT_ACCESS | D3D12_ROOT_SIGNATURE_FLAG_DENY_DOMAIN_SHADER_ROOT_ACCESS | D3D12_ROOT_SIGNATURE_FLAG_DENY_GEOMETRY_SHADER_ROOT_ACCESS;
D3D12_ROOT_SIGNATURE_DESC d3dRootSignatureDesc;
::ZeroMemory(&d3dRootSignatureDesc, sizeof(D3D12_ROOT_SIGNATURE_DESC));
d3dRootSignatureDesc.NumParameters = _countof(pd3dRootParameters);
d3dRootSignatureDesc.pParameters = pd3dRootParameters;
d3dRootSignatureDesc.NumStaticSamplers = _countof(pd3dSamplerDescs);
d3dRootSignatureDesc.pStaticSamplers = pd3dSamplerDescs;
d3dRootSignatureDesc.Flags = d3dRootSignatureFlags;
ID3DBlob* pd3dSignatureBlob = NULL;
ID3DBlob* pd3dErrorBlob = NULL;
D3D12SerializeRootSignature(&d3dRootSignatureDesc, D3D_ROOT_SIGNATURE_VERSION_1, &pd3dSignatureBlob, &pd3dErrorBlob);
pd3dDevice->CreateRootSignature(0, pd3dSignatureBlob->GetBufferPointer(), pd3dSignatureBlob->GetBufferSize(), __uuidof(ID3D12RootSignature), (void**)&pd3dGraphicsRootSignature);
if (pd3dSignatureBlob) pd3dSignatureBlob->Release();
if (pd3dErrorBlob) pd3dErrorBlob->Release();
return(pd3dGraphicsRootSignature);
}
D3D12 错误:ID3D12Device::CreateGraphicsPipelineState:根签名与顶点着色器不匹配:着色器 CBV 描述符范围(BaseShaderRegister=6,NumDescriptors=1,RegisterSpace=0)在根签名中未完全绑定
我该如何解决这个错误?
我附上了项目。 请您在忙的时候检查一次。
我想要渲染阴影。
D3D12 错误:ID3D12Device::CreateGraphicsPipelineState:根签名与顶点着色器不匹配:着色器 CBV 描述符范围(BaseShaderRegister=6,NumDescriptors=1,RegisterSpace=0)在根签名中未完全绑定
我想解决这个错误。