首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >(DX12阴影映射)深度缓冲区总是填充1

(DX12阴影映射)深度缓冲区总是填充1
EN

Stack Overflow用户
提问于 2022-10-20 16:28:14
回答 1查看 95关注 0票数 1

一般来说,我对图形编程很陌生,所以请容忍我。我试图在我的场景中添加来自远光(正交投影)的阴影映射,但当我遵循弗兰克·露娜( Frank露娜)的“DX12”(DX12)书中(非常不完整)的步骤时,我发现我用于影子地图的SRV只是填充了1的深度。

如果有帮助,以下是我的SRV定义:

代码语言:javascript
运行
复制
D3D12_TEX2D_SRV texDesc = {
        0,
        -1,
        0,
        0.0f
    };
    D3D12_SHADER_RESOURCE_VIEW_DESC srvDesc = {
        DXGI_FORMAT_R32_TYPELESS,
        D3D12_SRV_DIMENSION_TEXTURE2D,
        D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING,
    };
    srvDesc.Texture2D = texDesc;

    m_device->CreateShaderResourceView(m_lightDepthTexture.Get(),&srvDesc, m_cbvHeap->GetCPUDescriptorHandleForHeapStart());

下面是我的DSV堆和描述符定义:

代码语言:javascript
运行
复制
D3D12_DESCRIPTOR_HEAP_DESC dsvHeapDesc = {};
    dsvHeapDesc.NumDescriptors = 2;
    dsvHeapDesc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_DSV;
    dsvHeapDesc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_NONE;
    ThrowIfFailed(m_device->CreateDescriptorHeap(&dsvHeapDesc, IID_PPV_ARGS(&m_dsvHeap)));

    D3D12_DEPTH_STENCIL_VIEW_DESC depthStencilDesc = {};
    depthStencilDesc.Format = DXGI_FORMAT_D32_FLOAT;
    depthStencilDesc.ViewDimension = D3D12_DSV_DIMENSION_TEXTURE2D;
    depthStencilDesc.Flags = D3D12_DSV_FLAG_NONE;

    CD3DX12_HEAP_PROPERTIES heapProps = CD3DX12_HEAP_PROPERTIES(D3D12_HEAP_TYPE_DEFAULT);
    CD3DX12_RESOURCE_DESC resourceDesc = CD3DX12_RESOURCE_DESC::Tex2D(DXGI_FORMAT_R32_TYPELESS, m_width, m_height, 1, 0, 1, 0, D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL);

    D3D12_CLEAR_VALUE depthOptimizedClearValue = {};
    depthOptimizedClearValue.Format = DXGI_FORMAT_D32_FLOAT;
    depthOptimizedClearValue.DepthStencil.Depth = 1.0f;
    depthOptimizedClearValue.DepthStencil.Stencil = 0;

    ThrowIfFailed(m_device->CreateCommittedResource(
        &heapProps,
        D3D12_HEAP_FLAG_NONE,
        &resourceDesc,
        D3D12_RESOURCE_STATE_DEPTH_WRITE,
        &depthOptimizedClearValue,
        IID_PPV_ARGS(&m_dsvBuffer)
    ));

    D3D12_RESOURCE_DESC texDesc;
    ZeroMemory(&texDesc, sizeof(D3D12_RESOURCE_DESC));
    texDesc.Dimension = D3D12_RESOURCE_DIMENSION_TEXTURE2D;
    texDesc.Alignment = 0;
    texDesc.Width = m_width;
    texDesc.Height = m_height;
    texDesc.DepthOrArraySize = 1;
    texDesc.MipLevels = 1;
    texDesc.Format = DXGI_FORMAT_R32_TYPELESS;
    texDesc.SampleDesc.Count = 1;
    texDesc.SampleDesc.Quality = 0;
    texDesc.Layout = D3D12_TEXTURE_LAYOUT_UNKNOWN;
    texDesc.Flags = D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL;

    ThrowIfFailed(m_device->CreateCommittedResource(
        &heapProps,
        D3D12_HEAP_FLAG_NONE,
        &texDesc,
        D3D12_RESOURCE_STATE_GENERIC_READ,
        &depthOptimizedClearValue,
        IID_PPV_ARGS(&m_lightDepthTexture)
    ));


    CD3DX12_CPU_DESCRIPTOR_HANDLE dsv(m_dsvHeap->GetCPUDescriptorHandleForHeapStart());
    m_device->CreateDepthStencilView(m_dsvBuffer.Get(), &depthStencilDesc, dsv);
    dsv.Offset(1, m_device->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_DSV));

    m_device->CreateDepthStencilView(m_lightDepthTexture.Get(), &depthStencilDesc, dsv);

然后我创建了一个基本的顶点着色器,它用我的地图来转换顶点(摘自弗兰克·露娜的书,第648,650页)。由于我将m_lightDepthTexture绑定到D3D12GraphicsCommandList::OMSetRenderTarget,所以我假设深度值将写入m_lightDepthTexture。但是在我的主要通过中,简单地取样这个纹理证明了这个值实际上是1.0f。所以在我的影子通行证上什么都没发生!

我真的不知道该问什么,但如果有人有我能看到的DX12影子地图样本(谷歌拿出的DX11或更少的,或者太复杂的例子),或者如果有一个很好的来源来了解这一点,请告诉我!

编辑:我应该说我改变了DXGI_FORMAT_D24_UNORM_S8_UINT的格式,因为我认为模板的额外8位与我的情况无关。我改回了书的格式,没有什么改变,所以我认为这个格式应该是好的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-10-21 23:34:54

如果您从阴影顶点着色器中删除了不可缺少的return ret;,那么问题似乎是在您的球体顶点的缠绕顺序中。您可以很容易地验证这一点,为您的影子粒子群优化设置裁剪模式为D3D12_CULL_MODE_NONE

您可以轻松地通过切换每个三角形的任意两个顶点的顺序来纠正您的球面缠绕顺序,所以无论您在哪里有p1,p2,p3,您只需将其写成p1,p3,p2

你还需要检查你的矩阵乘法顺序在你的顶点着色,我没有详细检查,但这是不一致的,我相信,为什么球会出现黑色,当你解决上述问题。你似乎也错过了w为你的光和弦照明顶点着色器的除法。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74143313

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档