> ## Documentation Index
> Fetch the complete documentation index at: https://devdocs.xbox.com/llms.txt
> Use this file to discover all available pages before exploring further.

# 메시 셰이더 파이프라인 API 개요

> 메시 셰이더 파이프라인 API 개요

## 파이프라인 상태 생성

이러한 API의 사용 예는 [메시 셰이더 파이프라인 사용법](/build/core-features/graphics/newfeatures/ms/ms-usage)을 참조하세요.

다음 코드 예제는 메시 셰이더 기능 지원 API를 보여줍니다.

```c theme={null}
typedef  enum D3D12_FEATURE {
    ...
    D3D12_FEATURE_D3D12_OPTIONS7,
} D3D12_FEATURE;

typedef enum D3D12_MESH_SHADER_TIER
{
    D3D12_MESH_SHADER_TIER_NOT_SUPPORTED,
    D3D12_MESH_SHADER_TIER_1
} D3D12_MESH_SHADER_TIER;

typedef struct D3D12_FEATURE_DATA_D3D12_OPTIONS7 
{
    _Out_  D3D12_MESH_SHADER_TIER       MeshShaderTier;
    _Out_  D3D12_SAMPLER_FEEDBACK_TIER  SamplerFeedbackTier;
} D3D12_FEATURE_DATA_D3D12_OPTIONS7;

HRESULT ID3D12Device::CheckFeatureSupport(
  D3D12_FEATURE Feature,
  void*         pFeatureSupportData,
  UINT          FeatureSupportDataSize
);
```

다음 코드 예제는 파이프라인 스트림 생성 API를 사용하는 메시 셰이더 파이프라인 상태 사양을 보여줍니다.

```
typedef struct D3D12_PIPELINE_STATE_STREAM_DESC {
    _In_  SIZE_T SizeInBytes;
    _In_  void*  pPipelineStateSubobjectStream;
} D3D12_PIPELINE_STATE_STREAM_DESC;

HRESULT ID3D12Device2::CreatePipelineState(
    const D3D12_PIPELINE_STATE_STREAM_DESC* pDesc,
    REFIID                                  riid,
    void**                                  ppPipelineState
);
```

다음 코드 예제는 메시 셰이더 파이프라인 스레드그룹을 GPU에 디스패치하기 위한 Direct3D 12 API를 보여줍니다.

```c theme={null}
void ID3D12GraphicsCommandList::DispatchMesh(uint groupCountX, uint groupCountY, uint groupCountZ);

typedef enum D3D12_INDIRECT_ARGUMENT_TYPE {
    ...
    D3D12_INDIRECT_ARGUMENT_TYPE_DISPATCH_MESH
} D3D12_INDIRECT_ARGUMENT_TYPE;

typedef struct D3D12_INDIRECT_ARGUMENT_DESC
{
    D3D12_INDIRECT_ARGUMENT_TYPE Type; // = D3D12_INDIRECT_ARGUMENT_TYPE_DISPATCH_MESH
    union 
    {
        ...
        struct 
        {
            UINT ThreadGroupCountX;
            UINT ThreadGroupCountY;
            UINT ThreadGroupCountZ;
        } D3D12_DISPATCH_MESH_ARGUMENTS;
    }
} D3D12_INDIRECT_ARGUMENT_DESC;

void ID3D12GraphicsCommandList::ExecuteIndirect(
    ID3D12CommandSignature* pCommandSignature,
    UINT                    MaxCommandCount,
    ID3D12Resource*         pArgumentBuffer,
    UINT64                  ArgumentBufferOffset,
    ID3D12Resource*         pCountBuffer,
    UINT64                  CountBufferOffset
);
```

다음 코드 예제는 메시 셰이더 파이프라인을 만들고 디스패치하는 것을 보여줍니다.

```
struct MyPsoStreamDesc
{
    CD3DX12_PIPELINE_STATE_STREAM_ROOT_SIGNATURE        pRootSignature;
    CD3DX12_PIPELINE_STATE_STREAM_AS                    AS;
    CD3DX12_PIPELINE_STATE_STREAM_MS                    MS;
    CD3DX12_PIPELINE_STATE_STREAM_PS                    PS;
    CD3DX12_PIPELINE_STATE_STREAM_BLEND_DESC            BlendState;
    CD3DX12_PIPELINE_STATE_STREAM_DEPTH_STENCIL1        DepthStencilState;
    CD3DX12_PIPELINE_STATE_STREAM_RASTERIZER            RasterizerState;
    CD3DX12_PIPELINE_STATE_STREAM_RENDER_TARGET_FORMATS RTFormats;
    CD3DX12_PIPELINE_STATE_STREAM_DEPTH_STENCIL_FORMAT  DepthFormat;
    CD3DX12_PIPELINE_STATE_STREAM_SAMPLE_DESC           SampleDesc;
    CD3DX12_PIPELINE_STATE_STREAM_SAMPLE_MASK           SampleMask;
}

void CreatePipelineState(ID3D12Device* d3dDevice)
{
    // Check Mesh Shader pipeline feature support.
    D3D12_FEATURE_DATA_D3D12_OPTIONS7 options;
    device->CheckFeatureSupport(D3D12_FEATURE_D3D12_OPTIONS7, &options, sizeof(options));

    if (options.MeshShaderTier == D3D12_MESH_SHADER_TIER_NOT_SUPPORTED)
        throw std::exception("Mesh Shaders not supported!"); 

    // Set up PSO Stream Desc.
    MyPsoStreamDesc psoDesc;
    psoDesc.AS = D3D12_SHADER_BYTECODE{ ... };
    psoDesc.MS = D3D12_SHADER_BYTECODE{ ... };
    ...

    // Create Pipeline State Object with stream desc.
    D3D12_PIPELINE_STATE_STREAM_DESC desc = { sizeof(psoDesc), &psoDesc };
    device->CreatePipelineState(&desc, IID_PPV_ARGS(&msPso));
}

void Draw(ID3D12GraphicsCommandList* commandList)
{
    // Set up pipeline and root signature parameters.
    commandList->SetPipelineState(&msPso);
    commandList->SetGraphicsRootSignature(&msRootSig);
    ...

    // Dispatch threadgroups.
    commandList->DispatchMesh(someGroupCount, 1, 1);
}
```

## 메시 셰이더 내장 함수

### 속성

| 이름                 | 설명                                                                                                                     |
| ------------------ | ---------------------------------------------------------------------------------------------------------------------- |
| **OutputTopology** | 셰이더에서 내보내는 프리미티브 유형을 지정합니다 - "line" 또는 "triangle" 중 하나입니다. *indices* 공유 출력 배열 유형과 일치해야 합니다(라인은 *uint2*, 삼각형은 *uint3*). |

### 함수

|      |                                                                                                                                                                |
| ---- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 이름   | **SetMeshOutputCounts**                                                                                                                                        |
| 매개변수 | *uint numVerts* *uint numPrims*                                                                                                                                |
| 설명   | 스레드그룹이 내보낼 정점과 프리미티브의 수를 선언합니다 - 호출되지 않으면 카운트는 기본값 0입니다. 공유 출력 배열 길이보다 작거나 같아야 하며, 비발산 실행 컨텍스트에서 호출해야 하고 스레드그룹 상수 매개변수 값을 가정합니다. 출력 배열에 대한 모든 쓰기보다 앞에 있어야 합니다. |

### 매개변수

| 이름                 | 수정자 | 설명                                                                                                                                                            |
| ------------------ | --- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| *payload*          | in  | 증폭 셰이더에서 메시 셰이더 인스턴스의 클러스터로 전달되는 최대 16 KB의 사용자 정의 유형 페이로드 데이터입니다. 이 데이터는 클러스터의 모든 인스턴스 간에 공유됩니다. 파이프라인에서 메시 셰이더 앞에 증폭 셰이더 스테이지가 없는 경우에는 적용되지 않습니다.            |
| *vertices* array   | out | 정점 속성을 내보낼 공유 출력 배열입니다. 사용자 정의 정점 속성 유형과 배열 길이에 의한 최대 정점 내보내기 개수를 정의합니다.                                                                                      |
| *indices* array    | out | 프리미티브 인덱스를 내보낼 공유 출력 배열입니다. 내보낼 프리미티브 유형과 배열 길이에 의한 최대 프리미티브 내보내기 개수를 정의합니다. 이러한 프리미티브 인덱스는 *vertices* 배열로 직접 인덱싱됩니다. 유형은 라인의 경우 uint2, 삼각형의 경우 uint3이어야 합니다. |
| *primitives* array | out | 프리미티브 속성을 내보낼 공유 출력 배열입니다. 사용자 정의 프리미티브 속성 유형을 정의합니다. 그 길이는 *indices* 배열의 길이와 동일해야 합니다.                                                                       |

## 증폭 셰이더 내장 함수

### 함수

|      |                                                                                                                                                                         |
| ---- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 이름   | **DispatchMesh**                                                                                                                                                        |
| 매개변수 | *uint groupsX* *uint groupsY* *uint groupsZ* *groupshared payload\_t payload*                                                                                           |
| 설명   | 선택적 페이로드 데이터와 함께 메시 셰이더 스레드그룹의 클러스터를 디스패치합니다. 비발산 코드 경로에서 최대 한 번만 호출할 수 있습니다. 호출되지 않으면 0개의 스레드그룹이 디스패치됩니다. 이후 메시 셰이더 스레드그룹은 자체 클러스터로 GroupID와 DispatchThreadID가 로컬화됩니다. |

## 참고 항목

[메시 셰이더 파이프라인 개요](/build/core-features/graphics/newfeatures/ms/ms-overview)

[메시 셰이더를 사용하는 이유는?](/build/core-features/graphics/newfeatures/ms/ms-why)

[메시 셰이더 파이프라인 사용법](/build/core-features/graphics/newfeatures/ms/ms-usage)


## Related topics

- [메시 셰이더 파이프라인 개요](/ko/build/core-features/graphics/newfeatures/ms/ms-overview.md)
- [메시 셰이더를 사용하는 이유는?](/ko/build/core-features/graphics/newfeatures/ms/ms-why.md)
- [메시렛](/ko/build/core-features/graphics/newfeatures/ms/ms-meshlet-render.md)
- [XBOX Series X|S의 메시 셰이더 및 메시렛](/ko/build/core-features/graphics/newfeatures/ms/index.md)
- [메시렛 컬링 예제](/ko/build/core-features/graphics/newfeatures/ms/ms-meshlet-culling.md)
