🔍 Narrow-Range Filter for Screen-Space Fluid Rendering
이전에 구현했던 Screen-Space Rendering 방식은 다음과 같이 불연속 공간에서 왜곡이 발생한다.

이는 깊이 이미지를 생성할 때 진행하는 smoothing 과정에 의해 발생되는 것이다.
따라서, 이를 해결하기 위해 좁은 범위의 필터링 과정을 거쳐 해결한다.
과정은 다음과 같다.
1. Limiting the Depth Range
2. Bias Correction
3. Dynamic Range Adjustment
4. Separable Filter Approximation
📏 Limiting the Depth Range
기존의 screen-space fluid rendering에서는 smoothing 필터가 깊이 불연속을 무시하고 멀리 떨어진 입자까지 영향을 주는 경우가 많다. 이로 인해 입자 경계가 뭉개지는 현상이 발생한다.
이러한 문제를 해결하기 위해, Narrow-Range Filter에서는 다음 식을 통해 좁은 깊이 범위 내의 값만 smoothing에 사용하고, 그 외의 값은 클램핑(clamping) 처리를 통해 왜곡을 방지한다:
$$
\Large
z'_i = \sum_j \omega_{ij} \cdot f(z_j)
$$
여기서 $f$는 다음과 같이 정의된 클램핑 함수이다:
$$
\Large
f(z_i, z_j) =
\begin{cases}
z_j, & \text{if } z_j \geq z_i - \delta \\
z_i - \mu, & \text{otherwise}
\end{cases}
$$
이때, 깊이는 음수 값이며, 다음과 같이 현재 픽셀의 깊이 값보다 특정 값만큼 차이나면 무시하게 된다.

또한, $\omega_{ij}$는 필터 가중치이고 다음과 같이 정의된다:
$$
\Large
\omega_{ij} =
\begin{cases}
0, & \text{if } z_j > z_i + \delta \\
G(\mathbf{p}_i, \mathbf{p}_j, \sigma_i), & \text{otherwise}
\end{cases}
$$
이러한 방법은 시야 방향의 수직인 경우엔 깔끔하게 필터링되지만, 이외의 경우에선 불연속성 근처에서 여전히 변형(bias)가 발생한다.
따라서, Bias Correction 과정이 필요하다.
⚖️ Bias Correction
앞의 가중치 함수에 의해 필터 커널의 일부가 무시되기 때문에 바이어스가 발생한다.
따라서, 필터 커널이 항상 대칭이 되도록 바이어스 보정을 진행한다.
$$
\Large
\omega_{ij} =
\begin{cases}
0, & \text{if } z_j > z_i + \delta \text{ or } z_k > z_i + \delta \\
G(\mathbf{p}_i, \mathbf{p}_j, \sigma_i), & \text{otherwise}
\end{cases}
$$
이때 $k$는 다음을 의미한다:
$$
\Large
\mathbf{p}_k = \mathbf{p}_i + (\mathbf{p}_i + \mathbf{p}_j)
$$

📶 Dynamic Range Adjustment
$\delta$ 값이 작을 경우, 평평한 표면을 비스듬히 보면 깊이의 급격한 변화가 불연속처럼 보일 수 있으며, 너무 클 경우엔 불연속성을 포함하는 필터링을 진행할 수 있다. 따라서 다음이 성립하는 $\delta$ 를 설정한다.
$$
\Large
z_i + \delta_{high} \geq z_j \geq z_i - \delta_{low}
$$
또한, 이를 만족하는 $\delta$ 를 위해 아래와 같은 수식을 통해 필터링 진행 과정에서 동적으로 $\delta$ 값을 지정한다.
$$
\Large
f(z_i, z_j) =
\begin{cases}
z_j, & \text{if } z_j \geq z_i - \delta \\
z_i - \mu, & \text{otherwise}
\end{cases}
$$
🔀 Separable Filter Approximation
논문에서 제안하는 필터의 경우 분리할 수 없지만, 두 개의 1D 필터 패스를 번갈아 가며 적용하여 분리 가능한 필터 근사치를 사용하는 것은 가능하다. 그러나 이는 아래와 같이 줄무늬 현상이 발생하게 된다.

따라서, 이를 해결하기 위해 마지막에 작은 2D 고정 필터를 사용(Clean up) 한다.

🖼️ 결과
먼저, diffuse light만을 적용하여 기존의 bilateral blur와 narrow range blur 방식 그리고, clean up 적용 방식을 비교했다.


논문에서 제안한 것과 같은 결과를 보인다.
따라서, 최종적으로 모든 쉐이더 과정을 거쳐 두 결과를 비교했다.
참고 자료:
A Narrow-Range Filter for Screen-Space Fluid Rendering - Nghia Truong, Cem Yuksel
깃허브:
https://github.com/qkrdmstn/flip3d-turbulence-cuda
GitHub - qkrdmstn/flip3d-turbulence-cuda
Contribute to qkrdmstn/flip3d-turbulence-cuda development by creating an account on GitHub.
github.com
