DirectX12 3D 컨텐츠의 게임 개발 및 전투 장 VII (아래)

Direct3D의 형상을 이용하여 렌더링 (계속)

학습 목표

  1. 각 프레임은 프로그램의 성능을 최적화하기 때문에, 새로 고침 명령 대기열 렌더링 과정을 배울 필요 없을 것

  2. 서명 매개 변수 유형이 다른 두를 이해하려면, 루트 및 루트 일정 설명을

  3. 발견은 어떻게 생성 및 그리드, 라운드 테이블 및 공 같은 프로그램에 공통의 형상을 그리는

  4. 어떻게 동적 버텍스 버퍼를 통해 CPU의 정점 데이터를 업데이트하고 GPU에 새로운 정점 위치 정보를 업로드하는 방법 연구

7.6, 미세 뿌리 탐사 서명

우리는 이미 자원이 렌더링 파이프 라인에 결합 될 필요가 추첨 전에 전화를 정의하는 서명을 도입하는 방법과 그 자원의 입력 레지스터 쉐이더에 매핑됩니다.

7.6.1 루트 매개 변수

루트 서명은 지금까지, 우리는 루트 매개 변수 심볼 테이블도 만들어 단지 설명을 포함, 루트 일련의 매개 변수로 구성되어있다. 사실, 루트 세 가지 유형의 매개 변수를 선택할 수 있습니다 :

  1. 디스크립터 테이블 표 참조 디스크립터 자원을 결정 따를 연산자 스택의 연속적인 범위를 설명하는
  2. 루트 설명 : 루트는 기술자 스택의 존재를 필요로하지 않습니다, 자원을 준수 할 것에 나타낼 수있는 기술자로 직접 제공. 단, CBV 상수 버퍼 SRV 버퍼 / 루트 디스크립터를 결합하기 위해 UAV
  3. 루트 상수 : 32 비트 정수 값의 직렬 결합에 의해 직접 루트 일정

성능의 이유로, 루트 서명 64DWORD 루트 매개 변수 다음 매개 변수는 루트 공간 점유 세 가지 종류가보다 더 배치하지 않는 것이 좋습니다 :

  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;

세 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