Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Runtime error D3D12错误:基于GPU的验证:绘制,访问了未初始化的根参数。着色器阶段:像素,根参数索引:[1]_Runtime Error_Direct3d12 - Fatal编程技术网

Runtime error D3D12错误:基于GPU的验证:绘制,访问了未初始化的根参数。着色器阶段:像素,根参数索引:[1]

Runtime error D3D12错误:基于GPU的验证:绘制,访问了未初始化的根参数。着色器阶段:像素,根参数索引:[1],runtime-error,direct3d12,Runtime Error,Direct3d12,作为一名D3D12新手,我花了一段时间才明白这一点,但我在网上没有找到任何东西。 着色器编译良好,获取了所有资源,但输出一直为黑色。将调试级别设置为max并启用GPU验证后,我收到了错误消息,随后是某种汇编器跟踪和操作数转储。如果您在RootSignature中设置了根参数,而没有设置根参数,则会引发此错误 渲染循环中每个插槽的SetGraphicsRootDiscritPortable()或SetGraphicsRootConstantBufferView()或类似设置。 我无意中只写了 m_

作为一名D3D12新手,我花了一段时间才明白这一点,但我在网上没有找到任何东西。
着色器编译良好,获取了所有资源,但输出一直为黑色。将调试级别设置为max并启用GPU验证后,我收到了错误消息,随后是某种汇编器跟踪和操作数转储。

如果您在RootSignature中设置了根参数,而没有设置根参数,则会引发此错误 渲染循环中每个插槽的SetGraphicsRootDiscritPortable()或SetGraphicsRootConstantBufferView()或类似设置。 我无意中只写了

m_cl->SetGraphicsRootDescriptorTable( 0, m_srvHeap->GetGPUDescriptorHandleForHeapStart() );
这是从D3D12HelloTexture示例复制的,在很多方面我的程序都出错了

对于后期处理着色器,我使用了一个volatile常量缓冲区、两个静态纹理和一个volatile渲染纹理。根签名的资源部分如下所示:

CD3DX12_DESCRIPTOR_RANGE1 ranges[2] = {};
ranges[0].Init( D3D12_DESCRIPTOR_RANGE_TYPE_SRV, 4, 0, 0, D3D12_DESCRIPTOR_RANGE_FLAG_DATA_STATIC, 0 );
ranges[1].Init( D3D12_DESCRIPTOR_RANGE_TYPE_SRV, 1, 4, 0, D3D12_DESCRIPTOR_RANGE_FLAG_NONE, 4 );
CD3DX12_ROOT_PARAMETER1 rootParameters[2] = {};
rootParameters[0].InitAsConstantBufferView( 0 );
rootParameters[1].InitAsDescriptorTable( _countof( ranges ), ranges, D3D12_SHADER_VISIBILITY_PIXEL );
我的所有SRV都适合同一个描述符表,但具有不同的访问标志。所以我们需要2个范围。 注意:描述符范围(表)的最后一个参数是描述符映射中的偏移量。您需要确保每个描述符都有自己的索引。这对应于GPU上DescriptorHeap中的GetDescriptorHandleIncrementSize插槽。确保在以后创建ShaderResourceView时使用这些值:

ID3D12Resource* textureRes[]{ m_tex1, m_tex2, ... };
D3D12_SHADER_RESOURCE_VIEW_DESC srvDesc = {};
srvDesc.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING;
srvDesc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2D;
srvDesc.Texture2D.MipLevels = 1;
SIZE_T descSize = m_device->GetDescriptorHandleIncrementSize( D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV );

for( SIZE_T i = 0; i != _countof( textureRes ); i++ )
{
    m_device->CreateShaderResourceView( textureRes[i], NULL, { m_srvHeap->GetCPUDescriptorHandleForHeapStart().ptr + i * descSize } );
}
CBV直接转到根描述符以保存一个间接寻址,因此它不在描述符映射中,因此我们需要在渲染循环中设置它:

ID3D12DescriptorHeap* ppHeaps[] = { m_srvHeap };
m_cl->SetDescriptorHeaps( _countof(ppHeaps) , ppHeaps );
m_cl->SetGraphicsRootConstantBufferView( 0, m_cb->GetGPUVirtualAddress() );
m_cl->SetGraphicsRootDescriptorTable( 1, m_srvHeap->GetGPUDescriptorHandleForHeapStart() );
注意:第一个参数对应于上面的rootParameter[]插槽

已解决并运行良好。

您可能需要查看。