질문: neolith, 답변: casey muratori

질문1)
Kelly Dempski 가 쓴 'DirectX 실시간 렌더링 실전 테크닉' 이란 책에 있는 범프매핑에 대한 부분을 보면 범프매핑을 위한 버텍스의 포맷을 다음과 같이 정의하고 있습니다

Position[3], Normal[3], Texture[2], UTangent[3], VBinormal[3], UxV[3]

제가 알기론 UxV 도 normal 의 방향을 가리키게 된다고 하는데, Vertex 의 normal 과 같은 것입니까? 다른 것입니까? 다른 것이라면 정확히 어떤 차이점이 있는 것인지요?

답변1)
두개의 노말이란 것은 없습니다. 원래 노말이 있고, 그리고 탄젠트(tangent)-바이노말(binormal)-크로스(cross) 벡터가 있을 뿐입니다.

"진짜" 탄젠트 벡터는 dP/du 이고 "진짜" 바이노말 벡터는 dP/dv 입니다. 그것들은 각각 삼각형의 평면을 텍스춰 좌표 U 에 대해 편미분 한 것과, 텍스춰 좌표 V 에 대해 편미분 한 것들이죠. 이 두개의 벡터는 서로 직교하지 않는 경우가 대부분입니다. 왜냐하면 실제 게임의 모델에선 버텍스 3 개가 애초부터 직각삼각형 모양으로 배치되어있지 않은 경우가 대부분이기 때문이죠. 그 두개 자체가 직교하지 않기 때문에 버텍스의 노말에 대해서도 역시나 직교하지 않을 것입니다.

하지만, 탄젠트 공간 매핑이 효율적으로 작동하기 위해서는, 그 기저벡터들을 서로 직교하면서도 노말라이즈시켜놓아야 합니다 (Orthonormal). 이렇게 만드는데에는 명백하게 여러가지 방법이 있습니다. dP/dv 를 무시한 상태에서 탄젠트 벡터와 버텍스 노말벡터의 외적을 취해서 새로운 바이노말을 만들고, 다시 바이노말과 노말의 외적을 취해서 탄젠트를 만든다던가, 또는 탄젠트와 바이노말의 외적을 구해서 _새로운_ 노말을 만들고, 옛날의 노말은 없애버린 다음에, 다시 외적을 취해서 바이노말을 바꾸던가, 등등입니다.

따라서 "새로운" 노말이 오는 경우는, 원래의 탄젠트 벡터를 원래의 바이노말과 외적을 취해서 원래의 버텍스 노말 벡터 대신 새로운 노말 벡터를 만드는 경우입니다.

하지만, 그렇게 하는 방식은 그다지 권하고 싶지 않습니다. 왜냐하면 노말값은 라이팅 계산을 하는데 가장 중요한 부분을 차지하기 때문이고, 모든 렌더링 파이프라인을 통털어 일정한 값을 지니는 것이 보장되어야 하기 때문에, 노말값을 보존하는 방식 (즉, 탄젠트와 바이노말을 다시 외적을 구하는 방식) 을 권장합니다.

질문2)
ShaderX 라는 책에서는 버텍스 쉐이더에 버텍스 정보를 보낼 때, 바이노말 벡터를 보내는 대신 직접 버텍스 쉐이더 안에서 탄젠트와 노말간의 외적을 통해서 바이노말을 구하는 방법을 소개하고 있습니다. 그 방식을 통해서 그래픽 카드중간의 bandwidth 를 더 확보하는 방식을 권장하더군요. 바이노말을 직접 보내는 방식과 쉐이더에서 계산하는 방식 둘중 어느 것이 더 효율적인겁니까?

답변)
바이노말 벡터를 보내지 않는 방식이 확실히 빠릅니다. 그렇게 할 수 있다면 말이죠. 하지만, 대부분의 경우에는 그렇게 할 수가 _없습니다_. 왜냐하면 실제 그래픽 아티스트들은 텍스춰 공간을 절약하기 위해서 미러링을 쓰는 경우가 대부분이고, 텍스춰 공간을 절약하는 것은 버텍스 공간을 절약하는 것보다 훨씬 더 중요합니다. 그렇기 때문에 만약 미러링된 UV 좌표를 사용하게 된다면 (예를 들어서 얼굴의 양쪽 면을 똑같은 텍스춰를 이용해서 매핑할 경우) 여러분은 바이노말을 절대 빼먹을 수가 없습니다. 왜냐하면 어떤 경우에는 탄젠트 공간이 왼쪽 좌표계를 사용하게 되었다가 어떤 경우에는 오른쪽 좌표계를 사용하게 되는데, 면마다 달라지기 때문에 바이노말 벡터가 없이는 알 도리가 없습니다. 만약에 미러링을 사용하지 않는다면 직접 왼손좌표계나 오른손좌표계 둘중 하나로 통일하면 될 것입니다.

질문)
탄젠트 공간 노말과 오브젝트 공간 노말 둘중에 도대체 어떤걸 쓰는게 좋은겁니까? 속도와 결과물의 시각적 퀄리티의 측면에서 말입니다.

답변)
상황에 따라 다릅니다. 탄젠트 공간 매핑은 타일이나 미러링에 적합합니다. 이때에는 아무 다른 텍스춰를 쓸때처럼 대부분 자유롭게 쓸 수 있습니다. 오브젝트 공간맵은 그렇지 못합니다. 하지만, 스키닝이나 트위닝등으로 변형되지 않는 고정된 모델을 다룰때에는 오브젝트 공간맵은 버텍스 쉐이더의 계산량과 버텍스 정보의 계산량을 줄여줄 수 있습니다. 왜냐하면 탄젠트 공간같은걸 더 이상 전혀 신경쓰지 않아도 되기 때문입니다. 그러니까 만약에 텍스춰를 타일링하거나 미러링한 여러개의 고정된 모델들을 찍게 된다면, 당연히 오브젝트 공간맵을 쓰는것이 좋습니다. 훨씬 속도가 빨라지니까 말이죠

imcgames 의 김학규입니다