[Unreal Engine] Octachedral Impostor 1

이매·2026년 4월 15일

Unreal Graphics & Rendering

목록 보기
11/14

1. Octachedral Impostor

기존 Impostor 기법은 여러 방향에서 캡처한 이미지를 기반으로 비교적 자연스러운 결과를 만들어낸다. 그러나 최종 결과물의 품질은 어떤 방식으로 방향을 샘플링하느냐에 따라 크게 달라진다.
따라서 방향 정보를 어떤 기준으로 분포시키고, 이를 어떤 방식으로 텍스처에 배치할 것인지에 대한 고민이 필요하다.

이때 널리 사용되는 방식이 Octahedral Impostor이다.
이 방식은 방향 정보를 보다 균일하게 분포시킬 수 있으며, 이를 2D 공간에 효율적으로 매핑할 수 있다는 장점이 있다.

1-1. Impostor Texture Atlas 생성

Octahedral Impostor에서 정팔면체를 사용하는 이유는 구면 방향 정보를 2D 평면으로 효율적으로 펼칠 수 있기 때문이다.
일반적으로 Spatial Coordinate를 Plane Coordinate로 변환(3차원 방향 벡터를 2차원 평면 좌표로 변환)하기 위해서는 삼각함수의 연산이 필요하다. 하지만 Octahedron 기반 매핑에서는 이러한 연산 없이도 방향 정보를 비교적 균일하게 분포시킬 수 있으므로 계산 비용이 낮고 구현 또한 단순하다.

Sphere → Octahedron 변환

먼저 주어진 3D 위치 벡터인 구의 한 점을 다음과 같이 정의한다.

  • p=(x,y,z)\mathbf{p} = (x, y, z)

해당 점의 길이를 구한다.

  • L=p2=x2+y2+z2L = \|\mathbf{p}\|_2 = \sqrt{x^2 + y^2 + z^2}

구해진 길이를 이용해 방향 벡터를 만든다.

  • d=pL\mathbf{d} = \frac{\mathbf{p}}{L}

위 값들을 바탕으로 L1 Norm을 계산한다.

  • L1=dx+dy+dzL_1 = |d_x| + |d_y| + |d_z|

이제 L1 Norm으로 정규화하면 팔면체 위의 점이 된다.

  • d=dL1\mathbf{d'} = \frac{\mathbf{d}}{L_1}

원래 길이를 유지하기 위해 다시 곱해준다.

  • p=dL\mathbf{p'} = \mathbf{d'} \cdot L

마지막으로 원본 위치와 변형된 위치를 보간한다.

  • pfinal=(1α)p+αp\mathbf{p}_{final} = (1 - \alpha)\mathbf{p} + \alpha \mathbf{p'}

아래 코드는 이러한 과정을 그대로 구현한 예시이다.

FVector3d AOctachedralTestActor::DeformSphereToOctahedron(const FVector3d& Position, float Alpha) const
{
	const double Length = Position.Length();
	if (Length < KINDA_SMALL_NUMBER)
	{
		return Position;
	}

	const FVector3d Dir = Position / Length;
	const double L1 = FMath::Abs(Dir.X) + FMath::Abs(Dir.Y) + FMath::Abs(Dir.Z);

	if (L1 < KINDA_SMALL_NUMBER)
	{
		return Position;
	}

	const FVector3d OctPos = (Dir / L1) * Length;
	return FMath::Lerp(Position, OctPos, static_cast<double>(Alpha));
}

Texture Atlas 생성

이제 팔면체 기반 매핑을 이용하여 각 방향 정보를 2차원 평면 위의 좌표로 대응시킬 수 있게 됐다. 따라서 각 방향에 대응하는 위치에 맞추어 카메라 시점을 배치하고, 해당 시점에서 캡처한 이미지를 텍스처에 순서대로 저장하면 하나의 Texture Atlas를 구성할 수 있다.

이 과정에서는 각 방향 벡터에 대해 카메라 위치와 회전을 계산하고, 해당 결과를 개별 타일로 저장한다. 이렇게 생성된 아틀라스는 이후 런타임에서 시선 방향에 따라 적절한 이미지를 선택하거나 보간하는 데 사용된다.

이해를 돕기 위해 Scene Capture를 사용해 각 시점을 시각화하였다.

이후 각 시점에서 이미지를 캡처하고, 이를 정해진 배치 규칙에 따라 하나의 아틀라스로 합치면 Octahedral Impostor용 Texture Atlas를 얻을 수 있다.



참고 자료

Impostors 상세 해설 — 종이 한 장으로 만들어낸 아름다운 환상
hemi-octahedral impostors
Octahedral Impostors
GPU Gems 3 Chapter 21. True Impostors

profile
언리얼 엔진 주니어(신입) 개발자 | 소설 쓰는 취준 개발자

0개의 댓글