파티클 시스템은 화면에 떠다니는 다수의 개체를 표현할 때 사용하는 기술이다.
그리고 그 개체 하나 하나를 파티클이라고 한다.
- 이런 물방울들을 화면에 표현할 때 개체 하나 하나를 렌더링파이프라인을 거쳐 출력하면 성능이 매우 떨어질 것이다.
(몇천 몇만개가 되므로)
- 이번 주제는 이런 파티클들을 컴퓨트 쉐이더를 통해 어떻게 표현하는지에 대한 내용이다.
인스턴싱(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 |
댓글