동작 과정
1. 파티클 해시 계산
파티클의 위치값과 셀크기로 해당 파티클의 해시 값 계산
Particle p = Particles[index];
// 파티클 위치 p.position 을 그리드 최소 바운더리 위치를 기준으로 상대 위치로 변환
float3 relativePos = p.position - minBounds;
// 상대 위치를 셀 크기로 나누어, 각 축별로 몇 번째 셀에 해당하는지 실수 값으로 계산
float3 normalizedPos = relativePos / cellSize;
// floor 연산으로 소수점을 버려 정수 인덱스를 얻음 (이때 음수 인덱스 가능성 있음)
int3 cellID = int3(floor(normalizedPos));
uint hashValue = uint(cellID.x) +
uint(cellID.y) * gridDimX +
uint(cellID.z) * gridDimX * gridDimY;
입력 : 파티클 버퍼
struct Particle {
XMFLOAT3 position = XMFLOAT3(0.0f, 0.0f, 0.0f);
float radius = 0.0f;
XMFLOAT3 velocity = XMFLOAT3(0.0f, 0.0f, 0.0f);
float life = -1.0f;
XMFLOAT3 color = XMFLOAT3(1.0f, 1.0f, 1.0f);
float density = 0.0f;
XMFLOAT3 force = XMFLOAT3(0.0f, 0.0f, 0.0f);
float pressure = 0.0f;
};
출력 : 파티클 해시 버퍼
struct ParticleHash
{
UINT particleID = 0; // 원래 파티클 인덱스
UINT hashValue = 0; // 계산된 해시 값
UINT flag = 0; // 그룹 시작 플래그
};

2. 해시 값 기준 정렬
BitonicSort로 해시 값을 기준으로 오름차순으로 정렬 - Bitonic Sort 사용.
입력: ParticleHash
출력 : 정렬된 ParticleHash

3. 플래그 생성
정렬된 ParticleHash에서 i와 i - 1에서의 hashValue가 다르면 i 위치의 flag를 1로 설정
입력 : 정렬된 ParticleHash
출력 : 플래그 설정된 정렬된 ParticleHash

4. 플래그 스캔으로 그룹 생성
4-1. 지역스캔
스레드 그룹들끼리 공유 메모리를 이용해서 지역적으로 자기 위치 이전까지 몇개의 그룹이 존재하는지 측정
그룹 사이즈 - 1 위치의 값은 그 위치 이전에 지역적으로 존재하는 최대 그룹 수
그룹 사이즈 - 1 위치"까지"의 최대 그룹수는 그룹 사이즈 - 1 위치의 flag의 값이 1이면, 이전 최대 그룹 수에 1을 더해주면됨

4-2. 지역 스캔 결과로 나온 BlockSum들의 지역 스캔
4-1의 결과로 나온 그룹당 최대 그룹 수들의 모음을 가지고 4-1의 동작을 한번더 실행하면, 4-1의 각 그룹에 해당하는 그룹 Offset 값들( BlockSum )이 나오게 되고, 4-1의 지역 스캔결과와 4-2의 BlockSum을 연산해주면, 전체 정렬된 ParticleHash 의 각 객체에 해당하는 그룹들이 설정됨
입력 : 정렬된 ParticleHash
출력 : 전체 Scan


5. CompactCell 및 CellMap 설정
struct CompactCell
{
UINT hashValue = 0;
UINT startIndex = 0;
UINT endIndex = 0;
};
4의 결과를 통해서, 각 그룹이 정렬된 ParticleHash에서 어느 범위에 해당하는지를 설정
스캔 결과의 현재 index 위치의 값이 그룹 값이 된다
5-1. 현재 index의 정렬된 ParticleHash의 flag가 1이라면, 현재 그룹의 startIndex에 해당함
5-2. 현재 그룹이 최대 그룹 개수 - 1이면, ParticleHash의 최대개수- 1이 endIndex가 되고, 그 외에는 CompactCell에서 현재 그룹 + 1인 다음 그룹의 startIndex가 endIndex가 된다.
5-3. 이후 uint로 이루어진 CellMap을 설정할건데, 현재 그룹의 해시값 위치의 CellMap값이 현재 그룹 값으로 설정된다.
이전에 CellMap의 각 값은 -1로 초기화된다.

6. 파티클 시스템
https://minsdevblog.tistory.com/28
SPH 시뮬레이션 안정화
입자의 반지름(r) : 1.0커널 크기(h) : 반지름 * 4질량(m) : 2.0압력 계수(pressureCoeff) : 1.0기준 밀도(density0) : 1.0점성 계수(viscosityCoeff) : 1.0으로 설정해서 시뮬레이션을 진행했습니다.위 과정을 진행하
minsdevblog.tistory.com
참조
https://cg.informatik.uni-freiburg.de/publications/2014_EG_SPH_STAR.pdf
'SPH' 카테고리의 다른 글
| Smoothed Particle Hydrodynamics(SPH) (0) | 2025.04.10 |
|---|---|
| SPH 시뮬레이션 안정화 (0) | 2025.04.09 |
| 파티클 시스템 결과 렌더링 (0) | 2025.04.04 |
| 파티클 시스템 (0) | 2025.04.03 |
| SPH Fluids in Computer Graphics 1장 흐름 정리 (0) | 2025.04.03 |