큐브 매핑
Cube mapping
컴퓨터 그래픽에서 큐브 매핑은 큐브의 6면을 지도 모양으로 사용하는 환경 매핑 방법이다.환경은 정육면체 측면에 투영되어 6개의 사각 텍스처로 저장되거나 단일 텍스처의 6개 영역으로 펼쳐진다.큐브 맵은 각 큐브 면을 나타내는 90도 뷰 좌표로 정의된 뷰로 한 관점에서 씬(scene)을 6번 렌더링하여 생성된다.[1]
대부분의 경우 이미지 왜곡, 관점 의존성, 계산 비효율성 등 구체 매핑에 내재된 많은 문제를 제거하기 때문에 구형 방식인 구체 매핑보다 큐브 매핑을 선호한다.또한 큐브 매핑은 비효율성과 관점 의존성의 조합이 지속적으로 변화하는 관점이 있을 때 적용할 구면 매핑의 능력을 심각하게 제한하기 때문에 구면 매핑과 관련된 반사의 실시간 렌더링을 지원할 수 있는 훨씬 더 큰 용량을 제공한다.
큐브 매핑의 변형도 360 비디오 투영에서 흔히 사용된다.
역사
큐브 맵핑은 짐 블린과 마틴 뉴웰이 환경 맵핑을 처음 내놓은 지 10년 만인 1986년 네드 그린이 자신의 논문 '환경 맵핑과 세계 투영의 기타 응용 프로그램'[2]에서 처음 제안했다.그러나 6개의 텍스처 이미지에 동시에 액세스할 수 있는 능력에 대한 하드웨어 제한으로 인해 더 이상의 기술 개발 없이 큐브 매핑을 구현할 수 없게 되었다.이 문제는 1999년 엔비디아 지포스 256호가 출시되면서 해결됐다.엔비디아는 "개발자들이 정확한 실시간 반사를 만들 수 있는 GeForce 256의 혁신적인 이미지 품질 기능"이라고 하드웨어 큐브 매핑을 선전했다.하드웨어에서 가속화된 큐브 환경 매핑은 개발자들의 창의성을 자유롭게 하여 반사효과와 반사광 효과를 이용하여 흥미롭고 몰입적인 환경을 만들 것이다.[3]오늘날 큐브 매핑은 환경 매핑의 선호되는 방법으로서 여전히 다양한 그래픽 어플리케이션에서 사용되고 있다.
이점
큐브 매핑은 상대적인 단순성 때문에 다른 환경 매핑 방법보다 선호된다.또한 큐브 맵핑은 레이 트레이싱을 통해 얻은 결과와 유사하지만 계산적으로 훨씬 더 효율적이다. 즉, 중간 정도의 품질 저하는 효율의 큰 이득에 의해 보상된다.
큐브 매핑 사전 설정, 구체 매핑은 대부분의 애플리케이션에 비실용적인 많은 본질적인 결함을 가지고 있다.구체 매핑은 뷰에 의존하며, 각 관점에 대해 다른 질감이 필요하다는 것을 의미한다.따라서 관점이 유동적인 애플리케이션에서는 각 새로운 관점에 대한 새로운 영역 매핑을 동적으로 생성해야 한다(또는 모든 관점에 대한 매핑을 미리 생성해야 한다).또한 구의 표면에 매핑된 질감은 늘어나 압축되어야 하며, 뒤틀림과 왜곡(특히 구 가장자리를 따라)은 이것의 직접적인 결과물이다.비록 이러한 이미지 결함은 "사전 스레칭"과 같은 특정한 속임수와 기술을 사용하여 줄일 수 있지만, 이것은 구면 매핑에 또 다른 복잡성의 층을 더할 뿐이다.
파라볼로이드 매핑은 구면 매핑의 한계에 대한 약간의 개선을 제공하지만, 특별한 이미지 뒤틀림 작업과 더 많은 관련 연산 외에도 두 번의 렌더링 패스가 필요하다.
반대로 큐브 매핑은 단일 렌더 패스만 필요로 하며, 단순한 특성 때문에 개발자들이 이해하고 생성하기가 매우 쉽다.또한 큐브 매핑은 구면 및 파라볼로이드 매핑과 비교하여 텍스처 이미지의 전체 해상도를 사용하므로 동일한 품질을 얻기 위해 낮은 해상도 영상을 사용할 수도 있다.큐브 맵의 솔기를 다루는 것이 문제지만 솔기 동작을 처리해 매끄러운 반사가 되도록 알고리즘이 개발됐다.
단점들
만약 새로운 물체나 새로운 조명이 장면에 도입되거나 그 물체에 반사된 물체가 어떤 방식으로 움직이거나 변화하고 있다면, 반사 변화 및 큐브 맵을 다시 렌더링해야 한다.큐브 맵이 씬(scene)을 통해 이동하는 물체에 부착되면 큐브 맵도 새로운 위치에서 다시 렌더링해야 한다.
적용들
안정적인 규격 하이라이트
컴퓨터 보조 설계(CAD) 프로그램은 3D 물체를 렌더링할 때 표면 곡률감을 전달하기 위해 시각적 단서로 지정 하이라이트를 사용한다.그러나 많은 CAD 프로그램은 물체를 나타내는 데 사용되는 망사의 꼭지점에서만 조명 연산이 수행되고, 보간법은 물체 표면 전체에 걸쳐 조명을 추정하기 위해 사용되기 때문에 지정학적 하이라이트 샘플링에 문제를 보인다.문제는 메쉬 정점이 충분히 밀도가 높지 않아 지정 조명의 표본 추출이 불충분할 때 발생한다.이는 결국 그물 정점으로부터의 거리에 비례하는 밝기로 하이라이트를 만들어 내고 곡면성을 나타내는 시각적 단서들을 손상시킨다.불행히도, 이 문제는 단순히 더 밀도가 높은 메쉬를 만드는 것으로 해결될 수 없다. 왜냐하면 이것은 객체 렌더링의 효율성을 크게 떨어뜨릴 수 있기 때문이다.
큐브 맵은 안정적인 규격 하이라이트 렌더링을 위한 매우 간단하고 효율적인 솔루션을 제공한다.여러 가지 규격 하이라이트는 큐브 맵 텍스쳐로 인코딩할 수 있으며, 그 다음 표면의 반사 벡터를 통해 보간하여 좌표를 공급함으로써 접근할 수 있다.개별 정점에서의 조명 계산에 비해, 이 방법은 곡면성을 보다 정확하게 나타내는 더 깨끗한 결과를 제공한다.이 방법의 또 다른 장점은 렌더링 비용이 증가하지 않고 추가 규격 하이라이트를 텍스처로 인코딩할 수 있다는 점이다.그러나 다행히도 CAD 프로그램에서는 대개 그러하지만 광원은 멀리 있거나 무한 광원이어야 한다는 점에서 이 접근방식은 제한적이다.
스카이박스
아마도 큐브 매핑의 가장 진보된 적용은 미리 렌더링된 파노라마 스카이 이미지를 만드는 것인데, 이 이미지는 큐브 중앙에 위치한 뷰 포인트와 실질적으로 무한 거리에 있는 큐브의 면으로 그래픽 엔진에 의해 렌더링된다.그래픽 엔진에 의해 수행되는 큐브 면의 투시 투영은 큐브 맵을 생성하기 위해 환경을 투사하는 효과를 해제하여 관찰자가 스카이 박스를 생성하기 위해 사용되었던 장면에 둘러싸인 듯한 착각을 경험하게 한다.이 기술은 설계자들이 거의 성능비용이 들지 않고 게임에 복잡한 환경(실제로 탐험할 수 없는)을 추가할 수 있게 해주기 때문에 비디오 게임에서 널리 사용되고 있다.
스카이라이트 조명
큐브 맵은 실외 조명을 정확하게 모델링하는 데 유용할 수 있다.단순히 햇빛을 무한의 단일 빛으로 모델링하면 실외 조명이 지나치게 단순해지고 비현실적인 조명이 된다.비록 많은 빛이 태양으로부터 나오지만, 대기 중의 광선이 흩어지면 전 하늘이 광원(흔히 하늘빛 조명이라고 한다)으로 작용하게 된다.그러나 큐브 맵을 사용하면 천창 조명의 확산 기여도를 캡처할 수 있다.반사 벡터가 사용되는 환경 지도와 달리 이 방법은 표면 정상 벡터를 기반으로 큐브 맵에 접근해 천창에서 나오는 확산 조명의 빠른 근사치를 제공한다.이 방법의 한 가지 단점은 하늘빛을 적절하게 나타내기 위해 큐브 맵을 계산하는 것이 매우 복잡하다는 것이다; 최근의 한 과정은 큐브 맵에서 낮은 주파수 확산 조명을 가장 잘 나타내는 구형 고조파 기초를 계산하는 것이다.그러나, 효과적으로 스카이라이트 조명을 모델링하기 위해 상당한 양의 연구가 수행되었다.
동적 반사
기본적인 환경 매핑은 정적 큐브 맵을 사용한다 - 비록 물체가 이동되고 왜곡될 수 있지만, 반사된 환경은 일관성을 유지한다.그러나, 큐브 맵 텍스처는 역동적으로 변화하는 환경(예: 바람에 흔들리는 나무)을 나타내기 위해 지속적으로 업데이트될 수 있다.단순하지만 비용이 많이 드는 동적 반사를 생성하는 방법에는 모든 프레임에 대해 실행 시 큐브 맵을 작성하는 것이 포함된다.추가 렌더링 단계 때문에 정적 매핑보다 훨씬 덜 효율적이지만, 대화형 속도로 수행할 수 있다.
불행하게도, 이 기술은 여러 개의 반사 물체가 있을 때 잘 확장되지 않는다.독특한 동적 환경 지도가 각 반사 물체에 대해 일반적으로 필요하다.또한 반사 물체가 서로 반사할 수 있다면 추가적인 합병증이 추가된다. 동적 큐브 맵은 일반적으로 레이트레이싱을 사용하여 발생하는 효과에 근접한 값으로 재귀적으로 생성될 수 있다.
글로벌 조명
큐브맵 데이터 구조를 사용한 인터랙티브 속도로 글로벌 조명 계산을 위한 알고리즘이 ICCVG 2002에서 제시되었다.[1]
투영 텍스처
비디오 게임에서 널리 사용되는 또 다른 애플리케이션은 투사적인 텍스처 맵핑이다.예를 들어, 점 광원은 빛이 여과하는 창틀이나 랜턴 케이지 안에서 촬영한 파노라마 이미지인 큐브 맵에 연결된다.이를 통해 게임 개발자는 장면 형상을 복잡하게 하거나 값비싼 실시간 섀도 볼륨 계산에 의존하지 않고도 사실적인 조명을 얻을 수 있다.
메모리 주소 지정
큐브 텍스처는 포지티브 X, 네거티브 X, 포지티브 Y, 네거티브 Y, 포지티브 Z, 네거티브 Z 순으로 6가지 텍스처 맵을 인덱싱한다.[4][5]영상은 영상의 왼쪽 하단에 원점과 함께 저장된다.양의 X와 Y 면은 Z 좌표를 반전시켜야 하며 음의 Z 면은 X 좌표를 부정해야 한다.얼굴과 텍스처 좌표 , )이가) 주어진 경우, 비정규화된 벡터, y, ) 은 다음 함수로 계산할 수 있다.
공허하게 하다 convert_suv_to_xyz(인트로 색인을 달다, 둥둥 뜨다 u, 둥둥 뜨다 v, 둥둥 뜨다 *x, 둥둥 뜨다 *y, 둥둥 뜨다 *z) { // 범위 0을 1로 -1로 변환 둥둥 뜨다 uc = 2.0f * u - 1.0f; 둥둥 뜨다 VC = 2.0f * v - 1.0f; 바꾸다 (색인을 달다) { 케이스 0: *x = 1.0f; *y = VC; *z = -uc; 부숴뜨리다; // 포지티브 X 케이스 1: *x = -1.0f; *y = VC; *z = uc; 부숴뜨리다; // 음수 X 케이스 2: *x = uc; *y = 1.0f; *z = -VC; 부숴뜨리다; // 양의 Y 케이스 3: *x = uc; *y = -1.0f; *z = VC; 부숴뜨리다; // 마이너스 Y 케이스 4: *x = uc; *y = VC; *z = 1.0f; 부숴뜨리다; // 포지티브 Z 케이스 5: *x = -uc; *y = VC; *z = -1.0f; 부숴뜨리다; // 음수 Z } }
마찬가지로 벡터, y, ) 은(는) 다음과 같은 기능을 사용하여 얼굴 색인 및 텍스처 좌표, ) 로 변환할 수 있다.
공허하게 하다 convert_xyz_to_frome_uv(둥둥 뜨다 x, 둥둥 뜨다 y, 둥둥 뜨다 z, 인트로 *색인을 달다, 둥둥 뜨다 *u, 둥둥 뜨다 *v) { 둥둥 뜨다 복스 = 팹(x); 둥둥 뜨다 복시 = 팹(y); 둥둥 뜨다 absZ = 팹(z); 인트로 등변성자 = x > 0 ? 1 : 0; 인트로 등변량성 = y > 0 ? 1 : 0; 인트로 isZPositive = z > 0 ? 1 : 0; 둥둥 뜨다 최대축, uc, VC; // 포지티브 X 만일 (등변성자 && 복스 >= 복시 && 복스 >= absZ) { // u(0 ~ 1) +z에서 -z로 이동 // v(0 ~ 1)가 -y에서 +y로 변경됨 최대축 = 복스; uc = -z; VC = y; *색인을 달다 = 0; } // 음수 X 만일 (!등변성자 && 복스 >= 복시 && 복스 >= absZ) { // u(0 ~ 1) -z에서 +z로 이동 // v(0 ~ 1)가 -y에서 +y로 변경됨 최대축 = 복스; uc = z; VC = y; *색인을 달다 = 1; } // 양의 Y 만일 (등변량성 && 복시 >= 복스 && 복시 >= absZ) { // u(0 ~ 1)가 -x에서 +x로 변경됨 // v(0 ~ 1)가 +z에서 -z로 변경 최대축 = 복시; uc = x; VC = -z; *색인을 달다 = 2; } // 마이너스 Y 만일 (!등변량성 && 복시 >= 복스 && 복시 >= absZ) { // u(0 ~ 1)가 -x에서 +x로 변경됨 // v(0 ~ 1)가 -z에서 +z로 변경됨 최대축 = 복시; uc = x; VC = z; *색인을 달다 = 3; } // 포지티브 Z 만일 (isZPositive && absZ >= 복스 && absZ >= 복시) { // u(0 ~ 1)가 -x에서 +x로 변경됨 // v(0 ~ 1)가 -y에서 +y로 변경됨 최대축 = absZ; uc = x; VC = y; *색인을 달다 = 4; } // 음수 Z 만일 (!isZPositive && absZ >= 복스 && absZ >= 복시) { // u(0 ~ 1) +x에서 -x로 이동 // v(0 ~ 1)가 -y에서 +y로 변경됨 최대축 = absZ; uc = -x; VC = y; *색인을 달다 = 5; } // -1 ~ 1 ~ 0 ~ 1의 범위 변환 *u = 0.5f * (uc / 최대축 + 1.0f); *v = 0.5f * (VC / 최대축 + 1.0f); }
관련
실험을 위한 대규모 자유 큐브 맵 세트: http://www.humus.name/index.php?page=Textures
마크 밴드Wettering은 M. C. 에셔의 유명한 자화상 "반사구형 손"을 가져다가 지도를 뒤집어서 왼쪽, 오른쪽, 위쪽, 아래쪽, 뒤쪽, 앞쪽 등 큐브 지도 이미지를 얻었다.다음은 이러한 이미지를 사용한 3.js 데모(넓은 브라우저 창에서 가장 잘 볼 수 있으며 데모를 보려면 페이지를 새로 고쳐야 할 수도 있음):https://web.archive.org/web/20140519021736/http:///threejs.org/examples/webgl_materials_cubemap_escher.html
다른 환경 투영을 큐브 맵으로 변환할 수도 있다(예: 등각 투영에서 큐브 맵으로).
참조
- ^ 페르난도, R. & Kilgard M. J. (2003).CG 자습서:프로그램 가능한 실시간 그래픽에 대한 최종 가이드(1차 개정판)애디슨-웨슬리 롱먼 출판사보스턴, 미국. 제7장: 환경 지도 기법
- ^ Greene, N (1986). "Environment mapping and other applications of world projections". IEEE Comput. Graph. Appl. 6 (11): 21–29. doi:10.1109/MCG.1986.276658. S2CID 11301955.
- ^ 엔비디아, 2000년 1월기술 개요: 웨이백 머신에 보관된 2008-10-04 큐브 환경 매핑을 통한 완벽한 반사 및 지정 조명 효과
- ^ "Introduction To Textures in Direct3D 11 - Win32 apps Microsoft Docs".
- ^ "Chapter 19. Image-Based Lighting".
참고 항목
![]() | 위키미디어 커먼즈에는 큐브 매핑과 관련된 미디어가 있다. |