다음을 통해 공유


입방 환경 매핑(Direct3D 9)

큐브 맵이라고도 하는 입방 환경 맵은 개체가 큐브의 중앙에 있는 것처럼 개체를 둘러싼 장면을 나타내는 이미지 데이터를 포함하는 질감입니다. 입방 환경 맵의 각 면은 가로 및 세로의 90도 시야를 덮고 큐브 맵당 6개의 얼굴이 있습니다. 얼굴의 방향은 다음 그림에 나와 있습니다.

illustration of a cube with central coordinate axes perpendicular to cube faces

큐브의 각 면은 세계 공간에서 x/y, y/z 또는 x/z 평면에 수직으로 방향을 지정합니다. 다음 그림에서는 각 평면이 얼굴에 대응하는 방법을 보여 줍니다.

illustration of cube faces with coordinate projections from planes

입방 환경 맵은 일련의 텍스처 개체로 구현됩니다. 애플리케이션은 입방 환경 매핑에 정적 이미지를 사용하거나 큐브 맵의 얼굴에 렌더링하여 동적 환경 매핑을 수행할 수 있습니다. 이 기술을 사용하려면 큐브 맵 표면이 D3DUSAGE_RENDERTARGET 플래그 집합을 사용하여 만든 유효한 렌더링 대상 표면이어야 합니다.

큐브 맵의 얼굴은 주변 장면의 매우 상세한 렌더링을 포함할 필요가 없습니다. 대부분의 경우 환경 맵은 곡선 표면에 적용됩니다. 대부분의 애플리케이션에서 사용되는 곡률의 양을 감안할 때, 결과 반사 왜곡은 메모리 및 렌더링 오버헤드 측면에서 환경 맵의 극단적인 세부 정보를 낭비하게 만듭니다.

Mipmapped 입방 환경 지도

큐브 맵은 mipmapped할 수 있습니다. mipmapped 큐브 맵을 만들려면 CreateCubeTexture 메서드의 Levels 매개 변수를 원하는 수준 수로 설정합니다. 다음 다이어그램과 같이 이러한 표면의 지형을 구상할 수 있습니다.

diagram of a mipmapped cube map with n mip levels

Mipmapped 입방 환경 맵을 만드는 애플리케이션은 GetCubeMapSurface 메서드를 호출하여 각 얼굴에 액세스할 수 있습니다. 먼저 입방 환경 맵 표면 만들기(Direct3D 9)에 설명된 대로 D3DCUBEMAP_FACES 열거형 형식에서 적절한 값을 설정합니다. 다음으로 GetCubeMapSurface 수준 매개 변수를 원하는 mipmap 수준으로 설정하여 검색할 수준을 선택합니다. 0은 최상위 이미지에 해당합니다.

입방 환경 지도 대한 질감 좌표

입방형 환경 맵을 인덱싱하는 텍스처 좌표는 표준 텍스처가 적용될 때 사용되는 단순한 u, v 스타일 좌표가 아닙니다. 실제로 입방형 환경 맵은 텍스처 좌표를 전혀 사용하지 않습니다. 텍스처 좌표 집합 대신 입방 환경 맵에는 3D 벡터가 필요합니다. 적절한 꼭짓점 형식을 지정하려면 주의해야 합니다. 애플리케이션에서 사용하는 텍스처 좌표 집합 수를 시스템에 알리는 것 외에도 각 집합에 있는 요소 수에 대한 정보를 제공해야 합니다. Direct3D는 이러한 용도로 D3DFVF_TEXCOORDSIZEN 매크로 집합을 제공합니다. 이러한 매크로는 크기가 설명되는 질감 좌표 집합의 인덱스를 식별하는 단일 매개 변수를 허용합니다. 3D 벡터의 경우 D3DFVF_TEXCOORDSIZE3 매크로에서 만든 비트 패턴을 포함합니다. 다음 코드 예제에서는이 매크로를 사용 하는 방법을 보여 집니다.

// Create a flexible vertex format descriptor for a vertex that contains
//   a position, normal, and one set of 3D texture coordinates.

DWORD dwFVF = D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_TEX1 | D3DFVF_TEXCOORDSIZE3(0); 

확산 조명 매핑과 같은 경우에 벡터에 대해 카메라 공간 꼭짓점 법선이 사용합니다. 반사 환경 매핑과 같은 다른 경우에는 리플렉션 벡터를 사용합니다. 변환된 꼭짓점 법선은 널리 이해되기 때문에 여기에 있는 정보는 리플렉션 벡터를 계산하는 데 집중합니다.

리플렉션 벡터를 직접 계산하려면 각 꼭짓점의 위치와 뷰포인트에서 해당 꼭짓점으로의 벡터를 이해해야 합니다. Direct3D는 기하 도형에 대한 리플렉션 벡터를 자동으로 계산할 수 있습니다. 이 기능을 사용하면 환경 맵에 대한 질감 좌표를 포함할 필요가 없으므로 메모리가 절약됩니다. 또한 대역폭을 줄이고 T&L HAL 디바이스의 경우 애플리케이션이 자체적으로 만들 수 있는 계산보다 훨씬 빠를 수 있습니다. 이 기능을 사용하려면 입방 환경 맵이 포함된 텍스처 단계에서 D3DTSS_TEXCOORDINDEX 텍스처 스테이지 상태를 D3DTEXTURESTAGESTATETYPE D3DTSS_TCI_CAMERASPACEREFLECTIONVECTOR 멤버 와 텍스처 좌표 집합의 인덱스의 조합으로 설정합니다. 확산 조명 매핑과 같은 일부 상황에서는 D3DTEXTURESTAGESTATETYPE D3DTSS_TCI_CAMERASPACENORMAL 멤버를 사용하여 시스템이 변환된 카메라 공간, 꼭짓점 법선이 질감의 주소 지정 벡터로 사용되도록 할 수 있습니다. 인덱스는 시스템에서 텍스처에 대한 래핑 모드를 결정하는 데만 사용됩니다.

다음 코드 예제에서는이 값을 사용 하는 방법을 보여 집니다.

// The m_d3dDevice variable is a valid pointer
// to an IDirect3DDevice9 interface.

// Automatically generate texture coordinates for stage 2.
// This assumes that stage 2 is assigned a cube map.
// Use the wrap mode from the texture coordinate set at index 1.

m_d3dDevice->SetTextureStageState( 2, D3DTSS_TEXCOORDINDEX,
                                   D3DTSS_TCI_CAMERASPACEREFLECTIONVECTOR | 1); 

자동 텍스처 좌표 생성을 사용하도록 설정하면 시스템은 두 수식 중 하나를 사용하여 각 꼭짓점의 리플렉션 벡터를 계산합니다. D3DRS_LOCALVIEWER 렌더링 상태가 TRUE설정되면 다음 수식이 사용됩니다.

formula of the reflection vector (r = 2(exn)n-e)

앞의 수식에서 R은 계산되는 리플렉션 벡터이고, E는 정규화된 위치 대 눈 벡터이고, N은 카메라 공간 꼭짓점 법선입니다.

D3DRS_LOCALVIEWER 렌더링 상태가 FALSE설정되면 시스템에서 다음 수식을 사용합니다.

formula of the reflection vector (r = 2nzn-i)

이 수식의 R 및 N 요소는 이전 수식과 동일합니다. NZ 요소는 꼭짓점 법선의 세계 공간 z이고, 나는 무한히 먼 관점의 벡터(0,0,1)입니다. 시스템은 두 수식의 리플렉션 벡터를 사용하여 큐브 맵의 적절한 얼굴을 선택하고 주소를 지정합니다.

참고 항목

대부분의 경우 애플리케이션은 꼭짓점 법선의 자동 정규화를 사용하도록 설정해야 합니다. 이렇게 하려면 D3DRS_NORMALIZENORMALS TRUE설정합니다. 이 렌더링 상태를 사용하도록 설정하지 않으면 환경 맵의 모양이 예상과 크게 다릅니다.

 

추가 정보는 다음 항목에 포함되어 있습니다.

환경 매핑