이 글은 조만간 출판될 Game Programming Gems 3 한국어판(류광 역, 정보문화사)의 일부입니다. 이 글에 대한 모든 권리는 정보문화사가 가지고 있으며, 사전 허락 없이는 웹 사이트 게시를 비롯한 어떠한 형태의 재배포도 금지되어 있습니다.

이 글은 최종 교정 전의 상태이므로 오타나 오역이 있을 수 있습니다. 또한 웹 페이지의 한계 상, 실제로 종이에 인쇄된 형태와는 다를 수 있습니다. 실제 책에서는 표나 수식이 좀 더 정확한 형태로 표시될 것이며 그림/도표 안의 영문도 적절히 한글화될 것입니다.

Game Programming Gem 3 한국어판에 대한 정보는 GPG 스터디(http://www.gpgstudy.com/)에서 얻을 수 있습니다.

4.13 법선 맵을 이용한 곡면 흉내내기

Oscar Blasco, Aside Software
oscar_at_asidesoft.com

오늘날의 게임 내 모형들은 아직도 사실적인 것과는 거리가 멀다. 세부수준이 낮은 모형으로 곡면을 흉내내려 할 때에는 미리 조명이 적용된 텍스처가 흔히 쓰인다. 최근의 하드웨어들은 픽셀 당 조명 공식들(흔한 것이든 그리 흔하지 않은 것이든)의 계산을 수행할 수 있는 능력을 가지고 있다. 이 글은 한 표면의 법선들을 섭동시키고 범프 매핑을 통해서 조밀한 모형의 곡면을 흉내내는 방법에 대해 이야기한다. 이 방법을 이용하면 속도를 잃지 않고도 또는 좀 더 전통적인 세부 증가 방법들(손으로 직접 수정하는 등)을 포기하지 않고도 시각적인 품질을 향상시킬 수 있다(그림 4.13.1과 원색화보 9 참고).

그림 4.13.1 범프 매핑 처리의 결과. 왼쪽에서 오른쪽으로: 저해상도 모형, 원래의 모형, 범프 매핑을 이용한 최종 결과 두 가지

법선 맵

범프 매핑은 현재 점에서의 빛의 세기를 교란시키는 픽셀 당 처리이다. 이는 렌더링되는 픽셀을 더 밝게 또는 더 어둡게 할 수 있음을 의미한다. 다른 말로는, 조명 공식을 정점마다 계산하는 것이 아니라 픽셀마다 계산할 수 있다는 뜻이기도 하다. 수식 4.13.1은 빛의 반영(specular) 성분을 계산할 때 흔히 쓰이는 간단한 조명 공식이다.

   (4.13.1)

n은 법선으로, 범프 매핑에서는 이것이 텍스처의 한 텍셀로 저장된다(법선의 세 성분들을 RGB로 인코딩해서). 그러한 텍스처를 법선 맵이라고 부른다. 하드웨어는 n과 l, n과 h의 내적들을 계산하고 그 결과를 표면 색에 대한 하나의 변조(modulation) 비율로 사용한다. l은 국소 공간으로 변환되며, 내적은 ‘텍스처 공간(이에 대해서는 잠시 후에)’ 안에서 수행된다.

전반적인 처리 과정

곡면 근사 알고리즘은 조밀한 모형의 세부를 얻기 위한 일반적인 기법으로, 실시간 렌더링을 위한 저해상도 모형의 시각적 품질 향상에 아주 유용하게 쓰일 수 있다. 저해상도 모형 표면에 대한 조명을 변조함으로써 고해상도 모형이 가진 세부수준을 흉내낼 수 있는 것이다.

이를 위해 세 가지 모형들이 필요하다. 첫 번째로, 실시간 렌더링에 쓰일 것이 아닌 조밀한 고해상도 메시를 준비한다. 두 번째로, 그와 비슷한, 그러나 상호작용이 가능한 수준의 속도를 만족할 수 있을 만한 중간적인 해상도의 모형을 준비한다. 그러한 모형은 텍스처 매핑을 위한 uv 좌표들도 가지고 있어야 한다. 마지막으로 저해상도 모형도 필요한데, 반드시 조밀한 모형의 단순화된 버전일 필요는 없다. 이런 특징은 이 기법의 주된 장점이다. 이 덕분에 어떠한 문제를 해결하기 위해 모델러가 저해상도 메시를 직접 수정한다던가 그냥 직접적인 관련이 없는 다른 메시를 사용하는 것이 가능하다.

앞에서 말했듯이, 목표는 저해상도 메시에는 존재하지 않는 세부 정보를 얻어서 그것을 저해상도 메시의 적용하는 것이다. 저해상도 메시에 존재하지 않는 세부 정보란 바로 곡면에 대한 정보인데, 곡면은 법선들에 의해 정의되므로 조밀한 모형의 법선들을 잡아내서 하나의 맵에 저장해야 한다. 그것이 바로 법선 맵이다.

법선 맵이 만들어졌다고 할 때, 실행 시점에서 렌더링되는 과정은 이렇다. 법선 맵은 저해상도 메시의 각 점에서의 법선을 교란시킨다. 이는 조명 공식(식 4.13.1)의 내적들의 값에 영향을 미치며, 결과적으로 곡면처럼 보이는 조명 효과를 만들어낸다. 각 텍셀이 교란됨에 따라 표면은 그 점에서의 원래 객체와 비슷해 보이게 된다(이 글에서 이야기하는 법선 맵은 유한한 크기를 가져야 함을 주의할 것). 알고리즘은 대략 이런 것이다.

맵을 계산하기 위해서는:

전처리 과정

시작하기 전에 다음과 같은 데이터가 필요하다.

접선 공간 기저(tangent space basis)들은 계산된 법선을 텍스처 공간으로 변환하는 데 필요하다.

객체에 uv 매핑이 필요한 이유는 간단하다. 그게 없으면 저해상도 메시 맵을 텍스처로 매핑할 방법을 알 수 없기 때문이다(uv 좌표들에 관련된 일반적인 문제들에 대해서는 “알려진 문제들”을 참고할 것).

법선 계산

그럼 각 텍셀에서 교란된 법선을 계산하는 방법에 대해 살펴보자. 두 메시들은 서로 정점들을 공유하지 않으므로, 저해상도 메시의 표면에서 반직선을 쏘고 그것이 조밀한 모형과 교차하는지를 점검해야 한다.

Sander 등은 반직선의 방향을 선택하는 두 가지 방법에 대해 이야기한 바 있는데[Sander], 첫 번째는 현재 표면의 법선을 사용하는 것으로(최근점 방법), 개념이나 구현 모두 가장 간단하다. 두 번째 것은 표면들에 있는 법선들의 방향을 보간하는 것이다(법선 투사 방법).

그림 4.13.2에서 보듯이 법선 투사 방법이 더 나은 결과를 보인다. 최근점(closest-point) 방법의 결과에는 불연속성이 더 많이 나타난다.

그림 4.13.2 최근점과 법선 투사를 통한 법선 생성

그럼 법선을 얻는 방법에 대해 살펴보자. 저해상도 모형의 한 점에서 반직선을 쏘고 그것이 고해상도 모형과 만나는 교점을 구한다. 그리고 그 점에서의 법선을 그 교점이 속한 삼각형의 무게중심을 이용해서 계산한다.

삼각형 안의 한 점을 결정할 때 흔히 무게중심을 사용한다. P가 객체 공간에서의 교점이라고 하고 v0, v1, v2가 삼각형의 세 정점들이라고 하자. 무게중심의 세 좌표들은 다음과 같이 결정된다.

   (4.13.2)

   (4.13.3)

   (4.13.4)

무게중심 좌표 u, v, w는 교점과 삼각형 정점들에 의해 정의되는 해당 부분삼각형들(그림 4.13.3)의 넓이에 비례한다.

그림 4.13.3 무게중심 좌표들은 각 부분삼각형의 넓이에 비례한다.

이 u, v, w 좌표들은 충돌 점검에 유용한데, 왜냐하면 개별 정점마다 정의되는 임의의 속성들을 u, v, w로 보간할 수 있기 때문이다. 예를 들어서, 교점을 이 좌표들로 표현한다면:

   (4.13.5)

지금까지의 과정을 단계별로 정리한다면, 첫 번째로 저해상도 메시의 각 점에서 보간된 법선을 따라 하나의 반직선을 쏘고 고해상도 메시의 삼각형과의 교점을 얻는다. 두 번째로, 그 점의 무게중심 좌표들을 계산하고 그것으로 고해상도 메시의 그 점에서의 법선을 보간한다. 이런 식으로 얻은 법선들을 법선 맵에 저장해야 하는데, 그 전에 해야 할 일이 있다.

법선의 변환

조명 값을 텍스처 공간에서 계산하기로 했으므로, 법선을 사용하기 위해서는 법선을 텍스처 공간으로 변환해야 한다(그림 4.13.4).

그림 4.13.4 잡아낸 법선(H)이 텍스처 공간으로 변환된다(H').

표면의 한 점에서의 접선, 종법선(binormal), 법선을 하나의 행렬로 만들면(식 4.13.6), 그 행렬은 모형 공간을 텍스처 공간으로 변환하는 행렬이 된다(식 4.13.7은 변환된 법선이다). T, B, N을 접선 공간 기저라고도 부른다[Lengyel01].

   (4.13.6)

   (4.13.7)

후처리

법선 맵을 계산한 후에도, 법선 맵에는 여전히 빈 공간들이 많이 남아 있을 것이다. 래스터화 과정에서, 법선 맵의 빈 틈 때문에 텍스처 필터링에 의해 법선이 변하게 된다. 이는 법선 맵에 밝은 파란 색, 즉 RGB(127, 127, 255)를 채워서 해결할 수 있다. 그 색은 벡터 (0.0, 0.0, 1.0)에 해당한다.

많은 경우 파란 색으로 채워도 충분하지만, 더 나은 결과를 얻을 수 있는 다른 방법도 존재한다. 가장자리 확장 필터를 사용하는 경우, 텍스처의 다각형 가장자리 색을 확장하면 되는 것이다. 이러면 모든 하드웨어 필터링 문제들이 해결된다.

RGB 형태로 변환된 법선들을 정사각형 이미지로 만들었다면, 이제 그것을 압축이 없는 또는 무손실 압축 방식을 사용하는 이미지 형식의 파일로 저장한다. 예를 들어 JPEG는 피해야 하는데, 이는 JPEG의 경우 유손실 압축 알고리즘을 사용하므로 저장 과정에서 법선들이 변하기 때문이다.

알려진 문제들

여기서 이야기하는 반직선 추적 방식으로 만든 법선 맵을 사용할 때 몇 가지 문제들이 생기곤 하는데, 주된 이유는 두 가지이다. 하나는 uv 좌표들 때문이고, 또 하나는 빗나간 반직선 또는 부정확한 교점들에 관련된 것이다.

조밀한 모형의 굴곡이 심하다면, 그래서 하나의 반직선이 조밀한 모형의 표면에 두 번 이상 교차한다면 잘못된 법선을 얻게 된다(그림 4.13.5). 근본적인 해결책은 모델러가 그런 모형을 만들지 않는 것이다.

그림 4.13.5 반직선 투사 알고리즘들은 어떤 교점이 부정확한지 알지 못한다.

uv 좌표들의 경우, 두 가지 문제들에 신경을 써야 한다.

또 다른 접근방식

모형들이 공간적인 유사성을 가지고 있다면 또 다른 접근방식을 생각해 볼 수 있다. 저해상도 메시가 어떠한 단순화 알고리즘을 통해서 고해상도 메시로부터 절차적으로 만들어진다고 하자. 그리고 그 알고리즘이 원래의 모형의 정점들만을 사용한다고 하자. 그리고 원래의 모형에 uv 매핑이 이미 완료되어 있거나, 어떠한 알고리즘으로 추가된다고 하자. 이런 상황이라면 두 모형들에는 공유되는 정점들(따라서 동일한 u, v 좌표들)이 존재하며, 따라서 각 텍셀에 대해 모형들 사이의 직접적인 관계를 설정할 수 있다.

법선들을 좌표 공간으로 변환하지 않는다면 문제는 단순해진다. 이는 조밀한 모형의 법선들을 법선 맵에 직접 그려 넣는 것과 동일하므로, 그 과정을 3D 하드웨어 래스터화로 구현할 수 있다. 모형에 대한 uv 매핑을 절차적으로 수행할 수 있다면 이는 매우 유용한 방법이 된다.

그림 4.13.6 교란된 모형들. 위의 두 이미지들은 원래의 객체들이고, 아래의 둘은 알고리즘을 이용해서 생성한 결과이다.

결론

이 글에서는 알고리즘을 최대한 일반화시켜서 제시하고자 했다. 그러나 그러한 일반화에는 덜 정확하고 덜 빠르다는 의미도 내포되어 있다. ‘일반화’란 모형들 사이의 어떠한 관계에 의존하지 않는다는 뜻이다. 구체적인 목표는, 아티스트가 저해상도 메시의 정점들을 수정한다 해도 잘 작동하는 접근방식을 만드는 것이었다. 모형들이 정점들(그리고 uv 좌표들 같은 다른 정점 속성들)을 공유한다는 가정이 가능하다면 좀 더 최적화된 알고리즘들을 사용할 수 있을 것이다. 조밀한 모형에서 저해상도 모형을 얻을 때, 흔히 변 축약/정점 제거를 사용하는 단순화 알고리즘이 쓰인다. 그러한 단순화 접근방식의 단점은 명백하다. 단순화에 의해 면들의 크기 차이는 더 커지게 되는데, 그런 메시에는 uv 매핑이 힘들다. 또한 원래의 모형에 이미 uv 매핑이 되어 있었다면 매핑이 깨질 확률이 크다. 그런 제한이 있긴 하지만, 경우에 따라서는 그런 접근방식이 더 유용하게 쓰일 수도 있을 것이다.

법선 맵이 생성된 후에도, 세부수준을 높이기 위해 수작업으로 메시를 조작할 수 있다. 사실 그렇게 하는 것이 필요하기도 하다. 조밀한 메시에서 그러한 세부수준을 얻기란 힘든 일이며, 또한 상당히 비효율적이기도 하다. 반직선 투사를 통해서 얻은 법선들이 수작업으로 조절한 법선들만큼 정밀할 수는 없다. 간단한 법선 맵 결합 코드를 통해서 수작업으로 조절한 법선들을 알고리즘으로 생성한 법선 맵에 합치는 것도 가능하다. 텍스쳐에 저장된 법선의 교란 하나만 있으면 된다.

감사의 말

모형들(특히 그림 4.13.1의 머리)을 작성, 제공했으며 이 기법을 사용하고 테스트한 결과를 알려준 Julio Cesar Espada에게 감사한다. 또한 조언과 지원을 제공한 Ignacio Castano에게도 감사의 뜻을 전한다.

참고자료