微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 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.BorderColor = D3D12_STATIC_BORDER_COLOR_TRANSPARENT_BLACK;
sampler.MinLOD = 0.0f;
sampler.MaxLOD = D3D12_FLOAT32_MAX;
sampler.ShaderRegister = 0;
sampler.RegisterSpace = 0;
sampler.ShaderVisibility = D3D12_SHADER_VISIBILITY_PIXEL;

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

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 Color    : COLOR;
};
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:'未命名的 ID3D12Pipelinestate 对象',[EXECUTION ERROR #942:GPUSTATE_COM_RESEARCH]

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。