Direct3D 12 尝鲜(四): 旋转的彩色立方体

本文介绍了如何使用Direct3D 12创建一个旋转的彩色立方体,涵盖常量缓存、深度缓存和顶点/索引缓存的实现。通过常量缓存存放转换矩阵,深度缓存提高渲染效果,以及利用D3D12的特性优化内存分配。此外,还分享了相关代码和更新常量缓存的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

(转载请注明出处)

有点时间没更新了,原因是找了一个多星期的bug结果发现是少了一次加法运算。。。。
Orz
不过反正没人看也就没影响啦!_(:3」∠)_


这次的目的是做一个旋转的彩色立方体:
color cube

这是自己在学D3D11的时候做过的一个例子,现在搬到D3D12上, 这次增加的内容有:

    // 创建常量缓存
    if (SUCCEEDED(hr)) {
        hr = m_pd3dDevice->CreateCommittedResource(
            &CD3D12_HEAP_PROPERTIES(D3D12_HEAP_TYPE_UPLOAD),
            D3D12_HEAP_MISC_NONE,
            &CD3D12_RESOURCE_DESC::Buffer(D3D12_CONSTANT_BUFFER_DATA_PLACEMENT_ALIGNMENT),
            D3D12_RESOURCE_USAGE_GENERIC_READ,
            nullptr,
            IID_ID3D12Resource,
            reinterpret_cast<void**>(&m_pCBufferMatrix)
            );

    }
    // 绑定到常量缓存视图
    if (SUCCEEDED(hr)) {
        D3D12_CONSTANT_BUFFER_VIEW_DESC cbvDesc = {};
        cbvDesc.BufferLocation = m_pCBufferMatrix->GetGPUVirtualAddress();
        cbvDesc.SizeInBytes = D3D12_CONSTANT_BUFFER_DATA_PLACEMENT_ALIGNMENT;
        m_pd3dDevice->CreateConstantBufferView(
            &cbvDesc,
            m_aCpuHandleCSU[CSU_MatrixCBuffer]
            );
    }

这部分代码中, 使用D3D12_HEAP_TYPE_UPLOAD是因为我们每帧都要改写,这样比较方便, 相应的, 效率可能就会损失点.
还有就是之前提到的把所有相同的DESCRIPTOR集中放到一起, 所以写了个简单的框架, 使用m_aCpuHandleXXX数组存放的.
我们在这里存放3个矩阵: 世界、视角、透视转换矩阵
2. 深度缓存, 深度缓存的作用就不用说了, 灵活使用可以获取到不错的效果, 创建DSV绑定到DESCRIPTOR. 这里不使用模板, 仅仅使用深度:

    // 创建深度缓存
    if (SUCCEEDED(hr)) {
        D3D12_RESOURCE_DESC resourceDesc = CD3D12_RESOURCE_DESC::Tex2D(
            DXGI_FORMAT_R32_TYPELESS, m_uBufferWidth, m_uBufferHeight,
            1, 1, 1, 0, 
            D3D12_RESOURCE_MISC_ALLOW_DEPTH_STENCIL,
            D3D12_TEXTURE_LAYOUT_UNKNOWN, 0
            );
        D3D12_CLEAR_VALUE dsvClearValue;
        dsvClearValue.Format = DXGI_FORMAT_D32_FLOAT;
        dsvClearValue.DepthStencil.Depth = 1.0f;
        dsvClearValue.DepthStencil.Stencil = 0;
        hr = m_pd3dDevice->CreateCommittedResource(
            &CD3D12_HEAP_PROPERTIES(D3D12_HEAP_TYPE_DEFAULT),
            D3D12_HEAP_MISC_NONE,
            &resourceDesc,
            D3D12_RESOURCE_USAGE_DEPTH,
            &dsvClearValue,
            II
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值