程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了在 DirectX 12大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决在 DirectX 12?

开发过程中遇到在 DirectX 12的问题如何解决?下面主要结合日常开发的经验,给出你关于在 DirectX 12的解决方法建议,希望对你解决在 DirectX 12有所启发或帮助;

如标题所示,我在 DirectX 12 中遇到了一个简单纹理的问题。我很难描述整个事情,所以查看代码将解释我遇到的情况。它给了我黑色。 纹理:

    auto commandqueue = D3D12Core::Get().GetCommandQueue(D3D12_COMMAND_List_TYPE_DIRECT);
auto commandList = commandqueue->GetCommandList();

stbi_uc* data = stbi_load(filePath.c_str(),&m_WIDth,&m_Height,&m_BytesPerPixel,0);
m_TextureDesc.Dimension = D3D12_resourcE_DIMENSION_TEXTURE2D;
m_TextureDesc.Alignment = 0; 
m_TextureDesc.WIDth = m_WIDth;
m_TextureDesc.Height = m_Height;
m_TextureDesc.DepthOrArraySize = 1;
m_TextureDesc.MipLevels = 1; 
m_TextureDesc.Format = dxgi_FORMAT_R16G16B16A16_UnorM; 
m_TextureDesc.SampleDesc.Count = 1;
m_TextureDesc.SampleDesc.Quality = 0; 
m_TextureDesc.Layout = D3D12_TEXTURE_LAYOUT_UNKNowN; 
m_TextureDesc.Flags = D3D12_resourcE_FLAG_NONE;

auto device = D3D12Core::Get().GetDevice();

device->CreateCommittedresource(&CD3DX12_HEAP_PROPERTIES(D3D12_HEAP_TYPE_DEFAulT),D3D12_HEAP_FLAG_NONE,&m_TextureDesc,D3D12_resourcE_STATE_copY_DEST,nullptr,IID_PPV_ARGS(&texturE));

UINT64 textureUploadBufferSize;

device->GetcopyableFootprints(&m_TextureDesc,1,&textureUploadBufferSizE);

device->CreateCommittedresource(&CD3DX12_HEAP_PROPERTIES(D3D12_HEAP_TYPE_UPLOAD),&CD3DX12_resourcE_DESC::Buffer(textureUploadBufferSizE),D3D12_resourcE_STATE_GENERIC_READ,IID_PPV_ARGS(&UplodeTexturE));

subresource.PDAta = data;
subresource.RowPitch = m_Height * m_BytesPerPixel;
subresource.SlicePitch = subresource.RowPitch * m_WIDth;

updateSubresources(commandList.Get(),texture,UplodeTexture,&subresourcE);

commandList->resourcebarrIEr(1,&CD3DX12_resourcE_barRIER::Transition(texture,D3D12_resourcE_STATE_PIXEL_SHADER_resourcE));

着色器资源视图:

    auto device = D3D12Core::Get().GetDevice();

    D3D12_SHADER_resourcE_VIEW_DESC srvDesc = {};
    srvDesc.Shader4ComponentMapPing = D3D12_DEFAulT_SHADER_4_COMPONENT_MAPPing;
    srvDesc.Format = m_TextureDesc.Format;
    srvDesc.VIEwDimension = D3D12_SRV_DIMENSION_TEXTURE2D;
    srvDesc.Texture2D.MipLevels = 1;
    device->CreateShaderresourceVIEw(texture,&srvDesc,m_SRVHeap->GetcpuDescriptorHandleForHeapStart());

根签名中的描述符表参数:

 D3D12_DESCRIPTOR_RANGE  descriptortableRanges; 
descriptortableRanges.RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_SRV; 
descriptortableRanges.NumDescriptors = 1; 
descriptortableRanges.baseShaderRegister = 0; 
descriptortableRanges.RegisterSpace = 0; 
descriptortableRanges.OffseTinDescriptorsFromtableStart = D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND; 

D3D12_ROOT_DESCRIPTOR_table descriptortable = {};
descriptortable.NumDescriptorRanges = 1;
descriptortable.pDescriptorRanges = &descriptortableRanges;

m_RootParameters[1].ParameterType = D3D12_ROOT_ParaMETER_TYPE_DESCRIPTOR_table;
m_RootParameters[1].Descriptortable = descriptortable;
m_RootParameters[1].ShaderVisibility = D3D12_SHADER_VISIBIliTY_PIXEL;

我给根签名的静态采样器:

D3D12_STATIC_SAMPLER_DESC sampler = {};
sampler.Filter = D3D12_FILTER_MIN_MAG_MIP_POINT;
sampler.AddressU = D3D12_TEXTURE_ADDRESS_MODE_border;
sampler.Addressv = D3D12_TEXTURE_ADDRESS_MODE_border;
sampler.AddressW = D3D12_TEXTURE_ADDRESS_MODE_border;
sampler.MipLODBias = 0;
sampler.MaxAnisotropy = 0;
sampler.ComparisonFunc = D3D12_COMPARISON_FUNC_NEVER;
sampler.border@R_419_6004@ = D3D12_STATIC_border_@R_419_6004@_transparenT_BLACK;
sampler.MinLOD = 0.0f;
sampler.MaxLOD = D3D12_float32_MAX;
sampler.ShaderRegister = 0;
sampler.RegisterSpace = 0;
sampler.ShaderVisibility = D3D12_SHADER_VISIBIliTY_PIXEL;

然后我通过命令列表设置了描述符表:

@H_678_5@m_SRV = m_SRVHeap->GetGPUDescriptorHandleForHeapStart();
ID3D12DescriptorHeaP* heap = m_SRVHeap.Get();
commandList->SetDescriptorHeaps(1,&heap);
commandList->SetGraphicsRootDescriptortable(1,m_SRV);

像素着色器:

struct PixelShaderinput
{
float2 TexCoord : TEXCOORD;
float4 @R_419_6004@    : @R_419_6004@;
};
Texture2D tex : register(t0);
SamplerState s1 : register(s0);
float4 main(PixelShaderinput IN) : SV_TARGET
{
return tex.Sample(s1,IN.TexCoord);
}

编辑:

我还没有启用 GPUBasedValIDation 调试层,启用它后出现以下错误:

D3D12 错误:基于 GPU 的验证:绘制,不兼容的资源状态:资源:0x0D1FFFF8:'Textureresource',子资源索引:[0],描述符堆索引到 DescriptortableStart:[0],描述符堆索引 FromtableStart:[0],Binding Type In Descriptor: SRV,resource State: D3D12_resourcE_STATE_copY_DEST(0x400),Index of Descriptor Range: 0,Shader Stage: PIXEL,Root Parameter Index: [1],Draw Index: [0],Shader Code: C:\DevPractice \D3D12Test\D3D12Test\src\Shaders\Pixel.hlsl(10,2-40),Asm指令范围:[0x60-0x8b],Asm操作数索引:[3],命令列表:0x0D385EE0:'Unnamed ID3D12GraphicsCommandList Object',SRV /UAV/CBV 描述符堆:0x03F2AEC0:'未命名的 ID3D12DescriptorHeap 对象',采样器描述符堆:,管道状态:0x0D4A9788:'未命名的 ID3D12Pipeli@R_696_11335@tate 对象',[EXECUTION ERROR #942:GPUSTATE_COM_RESEARCH]

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

大佬总结

以上是大佬教程为你收集整理的在 DirectX 12全部内容,希望文章能够帮你解决在 DirectX 12所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签:12