UVAtlas 사용(Direct3D 9)

참고

UVAtlas는 원래 현재 사용되지 않는 D3DX9 유틸리티 라이브러리에 제공되었습니다. 최신 버전은 UV Atlas Command-Line Tool(uvatlas.exe)에서 사용할 수 있습니다.

많은 렌더링 및 콘텐츠 생성 기술에는 메시에 2D 신호(예: 텍스처)의 고유하고 겹치지 않는 맵이 필요합니다. 이러한 기술은 다음과 같습니다.

  • 일반/변위 매핑
  • 텍스처 공간 PRT 시뮬레이션 및 라이트 맵
  • Surface 그리기
  • 질감 공간 조명

고유한 UV 매핑을 수동으로 생성하는 것은 종종 시간이 많이 걸리고 지루합니다. 이는 입력 기하 도형이 복잡하고 효율적이고 왜곡이 낮은 텍스처 공간 사용률이 필요한 경우에 특히 그렇습니다. 다음 그림에서는 예제 메시와 해당 텍스처 아틀라스를 보여 줍니다.

예제 메시 및 해당 텍스처 아틀라스를 표시합니다.

이 예제에서는 메시(왼쪽)와 해당 UV 공간 표준 맵(오른쪽)을 보여 줍니다. 텍스처 아틀라스에는 여러 그룹 또는 데이터 클러스터가 포함되어 있습니다. 각 클러스터를 차트라고 하며 위의 예제에서 은 메시의 일부에 대한 일반 데이터를 포함합니다.

D3DX UVAtlas API는 겹치지 않는 최적의 텍스처 아틀라스를 자동으로 생성합니다. API는 다음을 수행할 수 있는 입력 매개 변수를 제공합니다.

  • 텍스처 확장, 왜곡 및 언더샘플링을 최소화합니다.
  • 메모리를 효율적으로 사용할 수 있도록 텍스처 공간 압축 밀도를 최대화합니다.
  • 메시 전체에서 균등 샘플링을 제공하여 샘플링 빈도의 불연속성을 최소화합니다.

UVAtlas 작동 방식

UVAtlas API( UVAtlas 함수 참조)는 표면을 차트로 분할하고 차트를 텍스처 아틀라스로 압축하여 텍스처 아틀라스를 생성합니다. D3DXUVAtlasPartitionD3DXUVAtlasPack을 사용하여 이러한 단계를 별도로 수행합니다. 또는 D3DXUVAtlasCreate를 사용하여 단일 호출로 분할, 매개 변수화 및 압축합니다.

메시 분할 및 매개 변수화

먼저 메시가 차트로 분할된 다음 각 차트가 자체 [0,1] UV 공간으로 매개 변수화됩니다. 원통형은 하나의 차트로 매개 변수화할 수 있습니다. 반면에 구에는 다음 그림과 같이 두 개의 차트가 필요합니다.

두 개의 차트로 분할된 구의 그림

단일 차트로 매개 변수화할 수 있는 메시는 "디스크에 대한 가정형"으로 분류됩니다. 즉, 무한히 유연하고 무한하게 확장 가능한 디스크를 차트에 분산하고 기하 도형을 완벽하게 커버할 수 있습니다. 이 늘이기는, 라고 하는, 양방향 함수; 즉, 정보를 잃지 않고 한 매개 변수화에서 다른 매개 변수화로 갈 수 있습니다.

메시를 클러스터 또는 차트로 구분하지 않고 두 차원으로 매개 변수화할 수 있는 실제 메시는 거의 없습니다. 다음 그림에서는 또 다른 예제 메시와 해당 텍스처 아틀라스를 보여 줍니다.

다른 셰이프와 해당 텍스처 아틀라스가 있는 예제 메시를 보여 줍니다.

만든 차트 수를 결정하는 두 가지 매개 변수가 있습니다.

  • 아틀라스에 허용되는 최대 차트 수
  • 각 차트에 허용되는 최대 스트레치 양

스트레치 양에 따라 생성된 차트 수와 샘플링의 전반적인 품질이 결정됩니다. 스트레치 범위는 0.0(스트레치 없음)에서 1.0(모든 스트레치 양)입니다. D3DXUVAtlasCreate 및 D3DXUVAtlasPartition은 알고리즘에서 생성된 최대 스트레치를 반환합니다. 다음 그림에서는 또 다른 예제 메시와 해당 텍스처 아틀라스를 보여 줍니다.

예제 메시 및 해당 텍스처 아틀라스 그림

통합 메트릭 텐서를 사용하여 매개 변수화 제어

텍스처 공간 우선 순위는 삼각형별로 지정할 수 있습니다. 통합 메트릭 텐서를 제공하여 결과 텍스처 공간 아틀라스에서 삼각형이 늘어나는 방식을 제어할 수 있습니다. IMT는 D3DX IMT 계산 함수를 사용하여 입력 신호에 따라 직접 지정하거나 계산할 수 있습니다. 통합 메트릭 텐서(또는 IMT)는 삼각형이 아틀라스에서 늘어나는 방법을 설명하는 대칭 2x2 행렬입니다. 각 IMT는 3개의 부동 소수로 정의되며, 이를 호출합니다(a,b,c). 다음과 같이 대칭 2x2 행렬로 정렬할 수 있습니다.

a b
b c

그런 다음 IMT를 사용하여 두 벡터 간의 거리를 찾을 수 있습니다. 지정된 두 개의 벡터 v1 및 v2( 여기서 :

vector v1
vector v2 = v1 + (s,t)

v1과 v2 사이의 거리는 다음과 같이 계산할 수 있습니다.

sqrt((s, t) * M * (s, t)^T)

즉, 벡터(s,t)는 u-v 공간에서 임의의 방향으로 스트레치의 크기일 수 있습니다. 이 경우 s 벡터는 첫 번째 꼭짓점에서 두 번째 꼭짓점까지의 방향이며 t는 법선과 s의 교차곱입니다. 예를 들면 다음과 같습니다.

(1,1) * (1,1) = (2,2)
        (1,1)
IMT(1,1,1) scales by 2
(1,-1) * (1,1) = (0,0)
         (1,1)
IMT(2,0,2) scales by 2 with no shearing

IMT는 D3DX IMT 계산 함수 D3DXComputeIMTFromPerVertexSignal, D3DXComputeIMTFromPerTexelSignal, D3DXComputeIMTFromSignal 및 D3DXComputeIMTFromTexture_graphics 사용하여 입력 신호를 기반으로 직접 지정하거나 계산할 수 있습니다.

개별 삼각형에 텍스처 공간을 할당하는 방법을 제어하려면 IMT 데이터를 직접 지정합니다. 이렇게 하면 아틀라스의 더 많은 영역을 메시의 중요한 영역(예: 캐릭터의 얼굴 또는 가슴 로고 또는 플레이어의 도보 경로 근처 장면 영역)에 할당합니다. ID 행렬의 배수인 IMT를 지정하면 결과 삼각형이 텍스처 공간에서 균일하게 크기 조정됩니다.

예를 들어 고해상도 표준 맵이 제공되면 IMT를 컴퓨팅하여 일반 맵에서 더 높은 주파수 신호 영역에 더 많은 텍스처 공간을 제공할 수 있습니다. 원래 일반 맵의 상수 영역에 매핑된 "평면"인 삼각형은 텍스처 공간을 줄입니다. 일반 지도 세부 정보가 많은 삼각형은 최종 결과에서 더 많은 텍스처 영역을 받게 됩니다. 그런 다음 일반 맵을 더 작은 텍스처로 다시 샘플링할 수 있지만 세부 정보를 유지하거나 최적의 UV 매핑으로 표준 맵을 다시 계산할 수 있습니다.

사용자 지정 주름에 인접 데이터 사용

사용자 정의 인접 정보를 분할 함수에 제공하여 메시의 미리 정의된 주름을 설명하고 인접한 얼굴 간의 차트 경계를 정의할 수 있습니다. 이는 호출자가 알고리즘에 대한 입력으로 자신의 차트 분할을 지정하는 간단한 방법입니다. 그러면 차트를 더 구체화하여 허용되는 최대값으로 늘입니다.

예제

이 예제에서는 UVAtlas API 및 directX 뷰어(Dxviewer.exe)를 사용하여 텍스처 아틀라스의 크기에 큰 영향을 줄 수 있는 모델에서 불연속성을 찾아 수정하는 방법을 보여 줍니다. Dxviewer.exe DirectX SDK에서 자세히 알아볼 수 있습니다. Dxviewer.exe 2009년 8월 버전 이후에 DirectX SDK에서 제거되었으므로 이를 얻으려면 적어도 2009년 8월 DirectX SDK가 필요합니다. DirectX SDK에 대한 자세한 내용은 DirectX SDK는 어디에 있나요?를 참조하세요.

즐겨 찾는 콘텐츠 생성 소프트웨어에서 일부 모델을 시작했다고 가정합니다(이 예제에서는 Maya에서 만든 난쟁이 헤드 모델을 사용). 텍스처화된 모델을 .x 파일로 내보내고 D3DXUVAtlasCreate를 사용하여 텍스처 아틀라스를 만듭니다. 결과 텍스처 아틀라스는 다음 그림과 비슷합니다.

난쟁이 모델의 아틀라스 그림

아틀라스에는 22개 차트와 최대 0.994개 차트가 있습니다.

이제 텍스처 모델을 확인하여 텍스처 아틀라스가 기하 도형에 얼마나 잘 매핑되는지 확인합니다. 이렇게 하려면 뷰어 도구에 모델을 로드합니다.

  • DirectX 유틸리티에서 뷰어 도구를 엽니다.
  • 열기 단추를 클릭하여 .x 파일을 로드합니다.
  • 보기 단추를 클릭하고 팝업에서 주름을 선택하여 주름 보기 옵션을 사용하도록 설정합니다.

다음 그림에서는 뷰어 도구에 표시되는 내용을 보여 줍니다.

뷰어 도구의 질감이 있는 메시 그림

각 선은 텍스처 아틀라스의 두 차트 사이에 인접한 가장자리인 주름입니다. 알고리즘에 의해 생성된 차트 수는 보통의 불연속성으로 인해 약간의 차이로 인해 발생합니다. 이러한 작은 차이는 용접 데이터, 즉 거의 같은 데이터를 강제로 감소할 수 있습니다. 노멀과 스킨웨이트를 용접하려면 다음을 수행합니다.

  • 메시에서 다음 명령줄을 사용하여 DirectX Ops(dxops.exe) 도구를 실행합니다('modelName.x'를 모델 이름으로 대체).
    Dxops.exe -s "load 'modelName.x'; Optimize n:2.01 w:2.01 uv0:0.01;  save 'newModelName.x';"
    

이는 노멀과 스킨웨이트를 비교하며 값이 2.01 미만인 경우 데이터가 동일하게 만들어집니다. 다음 그림에서는 용접 전의 주름(왼쪽) 및 용접 후의 주름(오른쪽)을 보기 위해 눈을 클로즈업하는 방법을 보여 줍니다.

용접 전 주름 그림 용접 후 주름 그림

그림 7: 용접으로 주름 제거

이 예제에서 용접은 입력 메시에서 86개의 꼭짓점을 제거했습니다. 메시의 주름이 적으면 다음 그림과 같이 아틀라스를 다시 생성할 수 있습니다.

주름이 제거된 새 아틀라스의 그림

아틀라스에는 7개 차트만 있고 최대 스트레치는 약 0.0776개입니다. 이제 새 아틀라스가 더 작은 텍스처에 맞습니다(이 예제에서는 약 30% 더 작음).

차트를 아틀라스로 압축

메시가 개별적으로 매개 변수가 있는 차트로 분할되면 차트를 단일 텍스처 맵으로 효율적으로 압축해야 합니다. 이는 D3DXUVAtlasCreate의 두 번째 단계로 수행되거나 D3DXUVAtlasPack을 호출하여 명시적으로 호출할 수 있습니다.

압축된 차트는 사용자가 지정한 여백 너비로 구분됩니다. 여백 너비는 차트를 분리하는 양이며, 차트 경계에서 아티팩트 렌더링을 방지하기 위해 쌍선형 보간 및 밉 매핑을 허용합니다. D3DX는 이러한 여백을 자동으로 채우기 위한 인터페이스를 제공합니다. 자세한 내용은 ID3DXTextureGutterHelper 를 참조하세요.

파이프라인에 UVAtlas 통합

텍스처 그리기 전에 아티스트가 호출하는 것 외에도 이러한 함수를 자동화된 아트 파이프라인에 통합할 수 있습니다. 예를 들어 PRT 시뮬레이션 또는 일반 매핑 패스를 수행하기 전에 자산이 업데이트된 후 UVAtlas 호출을 자동으로 실행할 수 있습니다. 이렇게 하면 메시의 토폴로지를 수정한 경우 개체의 UV 매핑을 수동으로 복구할 필요가 없습니다.

UVAtlas 함수의 사용 예는 UV Atlas Command-Line 도구(uvatlas.exe) 를 참조하세요.

고급 항목