ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

DirectX12红龙书练习解答 第7章 利用Direct3D绘制几何体(续)

2022-07-01 14:07:10  阅读:194  来源: 互联网

标签:auto 几何体 DirectX12 cmdList world Direct3D frameIndex ri objConstants


1.修改“Shapes”例程,以GeometryGenerator::CreateGeosphere方法替换程序中的GeometryGenerator::CreateSphere方法,并分别尝试使用0、1、2、3这4种细分等级。

细分等级为0:

 

 

 细分等级4:

 

 

 2.修改“Shapes”演示程序,用16个根常量来取代描述符表,以此设置物体的世界矩阵。

2.1BuildRootSignature方法修改:

 CD3DX12_DESCRIPTOR_RANGE cbvTable1;
    cbvTable1.Init(D3D12_DESCRIPTOR_RANGE_TYPE_CBV, 1, 1);

    // Root parameter can be a table, root descriptor or root constants.
    CD3DX12_ROOT_PARAMETER slotRootParameter[2];

    // Create root CBVs.
    slotRootParameter[0].InitAsConstants(16,0); // 描述符表用常量替换
    slotRootParameter[1].InitAsDescriptorTable(1, &cbvTable1);

2.2BuildConstantBufferViews方法把第一个循环删除。第一个循环是创建描述符表存ObjectConstants数据,现在我们改常量了。

void ShapesApp::BuildConstantBufferViews()
{

UINT passCBByteSize = d3dUtil::CalcConstantBufferByteSize(sizeof(PassConstants));

// Last three descriptors are the pass CBVs for each frame resource.
for(int frameIndex = 0; frameIndex < gNumFrameResources; ++frameIndex)
{
auto passCB = mFrameResources[frameIndex]->PassCB->Resource();
D3D12_GPU_VIRTUAL_ADDRESS cbAddress = passCB->GetGPUVirtualAddress();

// Offset to the pass cbv in the descriptor heap.
//int heapIndex = mPassCbvOffset + frameIndex;
int heapIndex = frameIndex;
auto handle = CD3DX12_CPU_DESCRIPTOR_HANDLE(mCbvHeap->GetCPUDescriptorHandleForHeapStart());
handle.Offset(heapIndex, mCbvSrvUavDescriptorSize);

D3D12_CONSTANT_BUFFER_VIEW_DESC cbvDesc;
cbvDesc.BufferLocation = cbAddress;
cbvDesc.SizeInBytes = passCBByteSize;

md3dDevice->CreateConstantBufferView(&cbvDesc, handle);
}

}

2.3.Draw修改,找到对passCBV偏移的脚本

int passCbvIndex = /*mPassCbvOffset +*/ mCurrFrameResourceIndex;//现在描述符堆里只有passCBV 已经不需要不需要加起始偏移mPassCbvOffset
auto passCbvHandle = CD3DX12_GPU_DESCRIPTOR_HANDLE(mCbvHeap->GetGPUDescriptorHandleForHeapStart());
passCbvHandle.Offset(passCbvIndex, mCbvSrvUavDescriptorSize);
mCommandList->SetGraphicsRootDescriptorTable(1, passCbvHandle);

2.4.DrawRenderItems修改

 for(size_t i = 0; i < ritems.size(); ++i)
    {
        auto ri = ritems[i];

        cmdList->IASetVertexBuffers(0, 1, &ri->Geo->VertexBufferView());
        cmdList->IASetIndexBuffer(&ri->Geo->IndexBufferView());
        cmdList->IASetPrimitiveTopology(ri->PrimitiveType);
        XMMATRIX world = XMLoadFloat4x4(&ri->World);

        {
             XMMATRIX world = XMLoadFloat4x4(&ri->World);

              ObjectConstants objConstants;
              XMStoreFloat4x4(&objConstants.World, XMMatrixTranspose(world));

            cmdList->SetGraphicsRoot32BitConstants(0, //根参数的索引
                16, &objConstants, 0);

        }
{//这一块代码用于给着色器传寄存器插槽0的数据,已经被上面的代码替代
//// Offset to the CBV in the descriptor heap for this object and for this frame resource. //UINT cbvIndex = mCurrFrameResourceIndex*(UINT)mOpaqueRitems.size() + ri->ObjCBIndex; //auto cbvHandle = CD3DX12_GPU_DESCRIPTOR_HANDLE(mCbvHeap->GetGPUDescriptorHandleForHeapStart()); //cbvHandle.Offset(cbvIndex, mCbvSrvUavDescriptorSize); /*cmdList->SetGraphicsRootDescriptorTable(0, cbvHandle);*/
}
cmdList->DrawIndexedInstanced(ri->IndexCount, 1, ri->StartIndexLocation, ri->BaseVertexLocation, 0); }

2.5UpdateObjectCBs修改DrawRenderItems

auto currObjectCB = mCurrFrameResource->ObjectCB.get();
    for(auto& e : mAllRitems)
    {
        // Only update the cbuffer data if the constants have changed.  
        // This needs to be tracked per frame resource.
        if(e->NumFramesDirty > 0)
        {
{//这一块修改数据被转移到 /*XMMATRIX world = XMLoadFloat4x4(&e->World); ObjectConstants objConstants; XMStoreFloat4x4(&objConstants.World, XMMatrixTranspose(world)); currObjectCB->CopyData(e->ObjCBIndex, objConstants);*/
}
// Next FrameResource need to be updated too. e->NumFramesDirty--; } }

2.6.效果

 

 3.在本书配套资源中,有一个名为Models/Skull.txt的文件。此文件含有渲染图7.11中骷髅头所需的顶点列表和索引列表。通过使用像记事本[4]这样的文本编辑器来查阅此文件,并修改“Shapes”演示程序来加载和渲染此骷髅头网格。

  第八章:LitColumns案例有答案

标签:auto,几何体,DirectX12,cmdList,world,Direct3D,frameIndex,ri,objConstants
来源: https://www.cnblogs.com/zjr0/p/16434397.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有