DirectX12 3Dゲーム開発やコンテンツの戦闘章VII(下)

ジオメトリを使用してDirect3Dのレンダリング(続きます)

学習目標

  1. 各フレームは、プログラムのパフォーマンスを最適化することが、リフレッシュコマンドキューレンダリングプロセスを習得する必要はいけません

  2. 署名パラメータの型を持つ他の二つを理解するには、次のルートとルートの一定の記述を

  3. このようなグリッドとして、ラウンドテーブルとボールをプログラムに共通のジオメトリを生成して描画する方法を発見

  4. 動的頂点バッファを介してCPUに頂点データを更新し、GPUに新しい頂点位置情報をアップロードする方法の研究

7.6、細根探査署名

我々はすでにドロー前にコールを定義する署名で導入している、リソースは、レンダリングパイプラインにバインドする必要があり、どのようにこれらのリソースは、入力レジスタシェーダにマップされます。

7.6.1、ルートパラメータ

ルート署名は、ルート、一連のパラメータで構成され、これまでのところ、我々だけルートパラメータシンボルテーブルも作成しただけ記述が含まれています。実際には、ルート・パラメータの3種類があり、選択することができます。

  1. ディスクリプタテーブル:テーブル参照記述子が結合されるべきリソースを決定するためのオペレータスタックの連続した範囲を記述することです
  2. ルート・ディスクリプタ:ルートがバインドされるリソースを示すことができ、それは記述子スタックの存在を必要としない記述子によって直接提供。しかし、ルート・ディスクリプタをバインドするために、唯一のCBV定数バッファ、SRVバッファ/ UAV
  3. ルート定数:32ビット定数値の系列に直接結合によるルート定数

パフォーマンスの理由から、ルート署名は、より64DWORDルートパラメータ以外の場所に最高ではないが、以下のパラメータは、ルートスペース占有の3種類があります:

  1. ディスクリプタ・テーブル:1DWORD
  2. ルート記述子:2DWORD
  3. ルート定数:各32ビットの定数、1DWORD会計

コードでは、我々はCD3DX12_ROOT_PARAMETERルート構造を充填するためのパラメータを記述する必要がある、構造がCD3DX12_ROOT_PARAMETER D3D12_ROOT_PARAMETERの拡張が行われ、得られた補助初期化関数の数を増やします

typedef struct D3D12_ROOT_PARAMETER
{
    //用于指示根参数的类型(描述符表,根常量或者根描述符)
    D3D12_ROOT_PARAMETER_TYPE ParameterType;
    //描述根参数的结构体
    union 
        {
        D3D12_ROOT_DESCRIPTOR_TABLE DescriptorTable;
        D3D12_ROOT_CONSTANTS Constants;
        D3D12_ROOT_DESCRIPTOR Descriptor;
        };
    //指定此根参数在着色器程序中的可见性
    D3D12_SHADER_VISIBILITY ShaderVisibility;
}D3D12_ROOT_PARAMETER;

7.6.2、ディスクリプタ・テーブル

パラメータの種類を定義するために、部材DescriptorTableを充填しD3D12_ROOT_PARAMERTER構造体がルート記述子テーブルである(記述子Tabel)

typedef struct D3D12_ROOT_DESCRIPTOR_TABLE
{
    //D3D12_DESCRIPTOR_RANGE类型数组的元素个数
    UINT NumDescriptorRanges;
    //指向D3D12_DESCRIPTOR_RANGE类型数组的指针
    const D3D12_DESCRIPTOR_RANGE *pDescriptorRanges;
}D3D12_ROOT_DESCRIPTOR_TABLE;

上記構成により、我々はタイプD3D12_DESCRIPTOR_RANGE配列を指定することができます。

typedef struct D3D12_DESCRIPTOR_RANGE
{
    //此范围中的描述符类型
    D3D12_DESCRIPTOR_RANGE_TYPE RangeType;
    //此范围内描述符的数量
    UINT NumDescriptors;
    //此描述符范围要绑定的基准着色器寄存器
    UINT BaseShaderRegister;
    //此描述符范围要绑定的寄存器空间
    UINT RegisterSpace;
    //此描述符范围距离描述符表起始地址的偏移量
    UINT OffsetInDescriptorsFromTableStart;
}D3D12_DESCRIPTOR_RANGE;

次に、我々は例を与える:3でCBV、2ヶ月とSRVのUAVは、ディスクリプタ・テーブルを作成し、

//用3个CBV、2个SRV和1个UAV来创建一个描述符表
CD3DX12_DESCRIPTOR_RANGE descRange[3];
descRange[0].Init(D3D12_DESCRIPTOR_RANGE_TYPE_CBV, 3, 0, 0, 0);
descRange[1].Init(D3D12_DESCRIPTOR_RANGE_TYPE_SRV, 2, 0, 0, 3);
descRange[2].Init(D3D12_DESCRIPTOR_RANGE_TYPE_UAV, 1, 0, 0, 5);
CD3DX12_ROOT_PARAMETER slotRootParameter[1];
slotRootParameter[0].InitAsDescriptorTable(3, descRange, D3D12_SHADER_VISIBILITY_ALL);

7.6.3ルート記述子

部材記述子を充填しD3D12_ROOT_PARAMETER構造は、パラメータタイプは、ルート・ディスクリプタ(ルート記述子)のルートとして定義することができます。

typedef struct D3D12_ROOT_DESCRIPTOR
{
    //指定要绑定的着色器寄存器
    UINT ShaderRegister;
    //指定要绑定的着色器寄存器空间
    UINT RegisterSpace;
}D3D12_ROOT_DESCRIPTOR;

異なりディスクリプタ・テーブルには、我々は唯一の仮想アドレスにバインドリソースを必要とする、配備記述子に記述子ハンドルを対応するディスクリプタに設定する必要があります

//计算常量缓冲区的大小
UINT objCBByteSize = d3dUtil::CalcConstantBufferByteSize(sizeof(ObjectConstants));
//资源的虚拟地址
D3D12_GPU_VIRTUAL_ADDRESS cbAddress = objectCB->GetGPUVirtualAddress();
//偏移到缓冲区中此物体常量的地址
cbAddress += i*objCBByteSize;
cmdList->setGraphicsRootVConstnatBufferView(0, objCBAddress);

7.6.4、ルート定数

充填構造D3D12_ROOT_PARAMETER定数のメンバーにより、さらなるパラメータタイプがルートのルート定数として定義されることができる(ルート定数)

typedef struct D3D12_ROOT_CONSTANTS
{
    //指定绑定的寄存器
    UINT ShaderRegister;
    //指定绑定的寄存器空间
    UINT RegisterSpace;
    //根参数所需要的32位常量个数
    UINT Num32BitValues;
}D3D12_ROOT_CONSTANTS;

実証されていないパラメータを使用してルートサンプル。

7.6.5、より複雑なルート署名例

必要に応じて次のシナリオシェーダリソースを考慮してください。

Texture2D gDiffuseMap : register(t0);

cbuffer cbPerObject : register(b0)
{
    float4x4 gWorld;
    float4x4 gTexTransform;
}

cbuffer cbPass : register(b1)
{
    float4x4 gView;
    float4x4 gInvView;
    float4x4 gProj;
    float4x4 gInvProj;
    float4x4 gViewProj;
    float4x4 gInvViewProj;
    float3 gEvePosW;
    float cbPerObjectPad1;
    float2 gRenderTargetSize;
    float2 gInvRenderTargetSize;
    float gNearZ;
    float gFarZ;
    float gTotalTime;
    float gDeltaTime;
    float4 gAmbientLight;
}

cbuffer cbMaterial : register(b2)
{
    float4 gDiffuseAlbedo;
    float3 gFresne1R0;
    float gRoughness;
    float4x4 gMatTransform;
}

ルート署名シェーダ説明すると、この対応します。

//描述符范围,给描述符表使用
CD3DX12_DESCRIPTOR_RANGE texTable;
texTable.Init(D3D12_DESCRIPTOR_RANGE_TYPE_SRV, 1, 0);

CD3DX12_ROOT_PARAMETER slotRootParameter[4];
//性能提示:按变更频率由高到低进行排列
slotRootParameter[0].InitAsDescriptorTable(1, &texTable, D3D12_SHADER_VISIBILITY_PIXEL);
slotRootParameter[1].InitAsConstantBufferView(0);
slotRootParameter[2].InitAsConstantBufferView(1);
slotRootParameter[3].InitAsConstantBufferView(2);
CD3DX12_ROOT_SIGNATURE_DESC rootSigDesc(4, slotRootParameter, 0, nullptr,
        D3D12_ROOT_SIGNATURE_FLAG_ALLOW_INPUT_ASSEMBLER_INPUT_LAYOUT);

7.6.6、バージョン制御パラメータのルート

わずかに

おすすめ

転載: www.cnblogs.com/yaya12138/p/11831774.html