파티클 시스템 크게 두 단계로 구분
- Compute Shader(이하 CS)를 이용한 SPH 연산
- CS연산 결과를 그래픽스 파이프라인에서 렌더링 진행
1에서의 파티클 시스템은 현재 -1.0에서 1.0 사이의 랜덤한 위치에서, 7가지의 랜덤한 색상, 5.0의 생명주기를 갖습니다.
CS 내에서는 속도에 중력(-9.8) * dt 을 적용, 위치는 속도 * dt를 적용합니다. 생명주기는 -dt만큼을 적용합니다.
CS에서는 Ping-Pong 형식으로 버퍼를 설정해 사용합니다.
PIX를 통해서 버퍼간 데이터가 잘 전달되고 연산되는지를 확인합니다.
왼쪽은 맨처음 Dispatch에서의 Ping 버퍼, 오른쪽은 Pong 버퍼입니다. y값의 변화를 보실수있습니다.
![]() |
![]() |
다음은 그 다음 프레임에서의 Dispatch 입니다. 이전 프레임의 결과가 현재 프레임의 인풋과 동일합니다. 현재 프레임의 결과 또한 변경됨을 보이므로, 파이프라인 상에서는 문제가 없음을 확인하였습니다.
![]() |
![]() |
그래픽스 파이프라인에서의 파티클 데이터 렌더 -> 진행중
StructuredBuffer는 그래픽스 파이프라인에서도 사용가능하기에 SPH 결과 StructuredBuffer를 가져와 그래픽스 파이프라인에서 사용해 렌더합니다.
vertex shader에서 파티클 정보를 geometry shader로 넘겨주고, 하나의 파티클 위치를 이용해 점 4개를 생성하고, 특정 위치를 바라보는 형식으로 구현합니다.
pixel shader에서는 얻은 정보들로 원하는 모양으로 파티클을 렌더한다.
Uniform Gird를 사용한 인접 입자 정렬 방식
- 공간을 격자(Uniform Grid) 형태로 나누기
- 2D 기준으로는 셀의 크기가 h인 격자의 셀로 (x,y)를 매핑한다고 했을때, cellX = x / h, cellY = y / h 가 셀의 인덱스에 해당한다
- 셀 인덱스로부터 해시 값 만들기
- 셀의 인덱스를 해싱해야하는데, 먼저 간단하게 hash = cellX + cellY * gridWidth로 설정한다.
- 모든 입자들에 대해 (입자 ID, 해시 값) 쌍으로 묶은 것을 정렬
- 입자 ID와 해시값 쌍을 넣은 자료구조를 새로 만들고, compute shader에서 Bitonic Sort를 사용해 해시 값 기준으로 정렬한다.
- 정렬된 배열 순회하면서, 각 셀마다 존재하는 입자들의 범위를 미리 기록
- 이웃 탐색 시 임의의 입자의 관심 범위 내의 입자들을 탐색
- SPH에서 설정하는 커널 반경을 사용해 범위를 지정
'SPH' 카테고리의 다른 글
SPH 개발 현황 (0) | 2025.04.09 |
---|---|
SPH 시뮬레이션 안정화 (0) | 2025.04.09 |
파티클 시스템 결과 렌더링 (0) | 2025.04.04 |
SPH Fluids in Computer Graphics 1장 흐름 정리 (0) | 2025.04.03 |
외부 힘 기반 SPH 파도 생성 및 제어 (0) | 2025.04.01 |