共用方式為


立方環境對應 (Direct3D 9)

立方體環境地圖 -有時稱為 Cube 地圖 - 是包含影像數據的紋理,代表對象周圍的場景,就像對象位於 Cube 的中心一樣。 立方環境地圖的每個臉部都會覆蓋水準和垂直的 90 度檢視範圍,每個立方體地圖各有六個臉部。 下圖顯示臉部的方向。

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

立方環境地圖會實作為一系列的紋理物件。 應用程式可以使用靜態影像進行立方體環境對應,也可以轉譯為 Cube 地圖的臉部,以執行動態環境對應。 這項技術需要 Cube 地圖表面是有效的轉譯目標表面,以設定D3DUSAGE_RENDERTARGET旗標來建立。

Cube 地圖的臉部不需要包含周圍場景的極詳細轉譯。 在大部分情況下,環境對應會套用至弧形表面。 鑒於大部分應用程式所使用的曲度量,產生的反光失真使得環境地圖在記憶體和轉譯額外負荷方面浪費了極端細節。

Mipmapped 立方環境 地圖

Cube 對應可以誤用。 若要建立Mipmapped Cube對應,請將 CreateCubeTexture 方法的 Levels 參數設定為您想要的層級數目。 您可以想像這些表面的地形,如下圖所示。

diagram of a mipmapped cube map with n mip levels

建立 mipmapped 立方體環境對應的應用程式可以呼叫 GetCubeMapSurface 方法來存取每個臉部。 首先,從D3DCUBEMAP_FACES列舉類型設定適當的值,如建立立方環境地圖表面 (Direct3D 9) 中所述。 接下來,將 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)。 系統會使用任一公式中的反映向量來選取並尋址 Cube 地圖的適當臉部。

注意

在大部分情況下,應用程式應該啟用頂點法線的自動正規化。 若要這樣做,請將D3DRS_NORMALIZENORMALS設定為 TRUE。 如果您未啟用此轉譯狀態,環境對應的外觀會與您預期的情況大相徑庭。

 

下列主題包含其他資訊。

環境對應