파티클 시스템 크게 두 단계로 구분

  1. Compute Shader(이하 CS)를 이용한 SPH 연산
  2. 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를 사용한 인접 입자 정렬 방식

  1. 공간을 격자(Uniform Grid) 형태로 나누기
  2. 2D 기준으로는 셀의 크기가 h인 격자의 셀로 (x,y)를 매핑한다고 했을때, cellX = x / h, cellY = y / h 가 셀의 인덱스에 해당한다
  3. 셀 인덱스로부터 해시 값 만들기
  4. 셀의 인덱스를 해싱해야하는데, 먼저 간단하게 hash = cellX + cellY * gridWidth로 설정한다.
  5. 모든 입자들에 대해 (입자 ID, 해시 값) 쌍으로 묶은 것을 정렬
  6. 입자 ID와 해시값 쌍을 넣은 자료구조를 새로 만들고, compute shader에서 Bitonic Sort를 사용해 해시 값 기준으로 정렬한다.
  7. 정렬된 배열 순회하면서, 각 셀마다 존재하는 입자들의 범위를 미리 기록
  8. 이웃 탐색 시 임의의 입자의 관심 범위 내의 입자들을 탐색
  9. 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

+ Recent posts