본문 바로가기
DirectX/[Inflearn_rookiss] Part2: DirectX12

26. Particle System_1

by 헛둘이 2023. 2. 13.

파티클 시스템은 화면에 떠다니는 다수의 개체를 표현할 때 사용하는 기술이다.

그리고 그 개체 하나 하나를 파티클이라고 한다.

 

- 이런 물방울들을 화면에 표현할 때 개체 하나 하나를 렌더링파이프라인을 거쳐 출력하면 성능이 매우 떨어질 것이다.

(몇천 몇만개가 되므로)

 

- 이번 주제는 이런 파티클들을 컴퓨트 쉐이더를 통해 어떻게 표현하는지에 대한 내용이다.

 

인스턴싱(Instancing)

- 동일한 객체를 한 화면에 여러 개 등장시킬 때 사용하는 기술

 

- 이 기술은 지금도 사용하고 있었다.

- CommandList의 DrawIndexedInstanced 함수는 이런 인스턴싱에 관여하며 2번째 인자가 한번에 그릴 개체의 개수를 의미한다.

 

struct Particle
{
    float3 worldPos;
    float curTime;
    float3 worldDir;
    float lifeTime;
    int alive;
    float3 padding;
};


StructuredBuffer<Particle> g_data : register(t9);

struct VS_IN
{
    float3 pos : POSITION;
    float2 uv : TEXCOORD;
    float3 normal : NORMAL;
    float3 tangent : TANGENT;
    uint id : SV_InstanceID;
};

struct VS_OUT
{
    float4 viewPos : POSITION;
    float2 uv : TEXCOORD;
    float id : ID;
};



struct ComputeShared
{
    int addCount;
    float3 padding;
};

RWStructuredBuffer<Particle> g_particle : register(u0);
RWStructuredBuffer<ComputeShared> g_shared : register(u1);

- Particle은 파티클 하나 하나의 생명주기에 관여

- VS_IN으로 들어오는 인자 중 SV_InstanceID는 아까 언급한 DrawIndexedInstanced에서 자신의 인덱스를 의미한다.

 

근데 한번에 넘기면 어떻게 구분하지?
- 이전에 컴퓨트쉐이더에 전달한 SV_InstanceID로 구분

 

구조화버퍼(StructuredBuffer)
- Constant Buffer와 별차이 없어보이지만, 사이즈를 유동적으로 사용할 수 있다.
- 그냥 사이즈가 가변인 1차원 배열이라고 볼 수 있음

 

인스턴싱으로 1000개를 그려준다고 하면,

그런데 파티클 1000개가 그냥 한번에 화면에 뿅 그려지는 게 목적이 아니라

중심으로부터 하나씩 순서대로 그려져서 움직이는 것이 목적이므로,

어떤 물체가 그려지고 어떤 물체가 그려지지 않을 지 결정해야 한다.

 

버텍스 쉐이더에서 정점을 화면 밖으로 옮겨서 컬링되게 할 수도 있으나,

더 좋은 방법은 지오메트리 쉐이더에서 그려줄 지 유무를 판단해서 그려주는 것.

'DirectX > [Inflearn_rookiss] Part2: DirectX12' 카테고리의 다른 글

28. Instancing  (0) 2023.02.14
27. Particle System_2  (0) 2023.02.14
25. Compute Shader  (0) 2023.02.12
24. Multi Render Target  (1) 2023.02.04
23. Orthographic Projection  (0) 2023.02.02

댓글