共用方式為


圖元模糊 (Direct3D 9)

圖元模糊會從裝置驅動程式中依圖元計算的事實取得其名稱。 這與頂點模糊不同,在轉換和光源計算期間由管線計算。 圖元模糊有時稱為資料表模糊,因為某些驅動程式會使用預先計算的查閱表格來判斷模糊因數,並使用每個圖元的深度來套用在混合計算中。 它可以使用 D3DFOGMODE 列舉型別的成員所識別的任何模糊公式來套用。 這些公式的實作是驅動程式特定的。 如果驅動程式不支援複雜的模糊公式,它應該會降級為較不復雜的公式。

Eye-Relative與 Z 型深度

為了減輕深度緩衝區中 z 值分佈不平均所造成的模糊相關圖形成品,大部分的硬體裝置會使用眼球相對深度,而不是以 Z 為基礎的深度值來進行圖元模糊。 眼球相對深度基本上是同質座標集中的 w 元素。 Microsoft Direct3D 會從裝置空間座標設定取得 RHW 元素的相互回應,以重現 true w。 如果裝置支援眼球相對模糊,當您呼叫IDirect3DDevice9::GetDeviceCaps方法時,它會在D3DCAPS9 結構的 RasterCaps成員中設定D3DPRASTERCAPS_WFOG旗標。 除了參考點陣化之外,軟體裝置一律會使用 z 來計算圖元模糊效果。

當支援眼球相對模糊時,如果提供的投影矩陣在世界空間中產生相當於裝置空間中 w 值的 z 值,系統會自動使用眼球相對深度,而不是以 Z 為基礎的深度。 您可以使用 D3DTS_PROJECTION 值,並傳遞代表所需矩陣的D3DMATRIX結構,藉此呼叫IDirect3DDevice9::SetTransform方法來設定投影矩陣。 如果投影矩陣不符合此需求,則不會正確套用模糊效果。 如需產生相容矩陣的詳細資訊,請參閱 投影轉換 (Direct3D 9)

Direct3D 使用目前以 w 型深度計算的投影矩陣。 因此,即使應用程式未使用 Direct3D 轉換管線,應用程式也必須設定符合規範的投影矩陣,才能接收所需的 w 型功能。

Direct3D 會檢查投影矩陣的第四個數據行。 如果係數為 [0,0,0,1] (,) 系統將會使用 z 型深度值來產生水氣。 在此情況下,您也必須指定裝置空間中線性模糊效果的開始和結束距離,範圍從最接近點的 0.0 到使用者,最遠點為 1.0。

使用圖元模糊

使用下列步驟在應用程式中啟用圖元模糊。

  1. 藉由將D3DRS_FOGENABLE轉譯狀態設定為 TRUE來啟用模糊混合。
  2. 設定D3DRS_FOGCOLOR轉譯狀態中所需的水氣色彩。
  3. 將D3DRS_FOGTABLEMODE轉譯狀態設定為 D3DFOGMODE 列舉型別的對應成員,以選擇要使用的模糊公式。
  4. 在相關聯的轉譯狀態中,將模糊參數設定為所選取的模糊模式。 這包括線性模糊的開始和結束距離,以及指數型模糊模式的空氣密度。

下列範例顯示這些步驟在程式碼中的外觀。

// For brevity, error values in this example are not checked 
//   after each call. A real-world application should check 
//   these values appropriately.
//
// For the purposes of this example, g_pDevice is a valid
//   pointer to an IDirect3DDevice9 interface.
void SetupPixelFog(DWORD Color, DWORD Mode)
{
    float Start   = 0.5f;    // For linear mode
    float End     = 0.8f;
    float Density = 0.66f;   // For exponential modes
 
    // Enable fog blending.
    g_pDevice->SetRenderState(D3DRS_FOGENABLE, TRUE);
 
    // Set the fog color.
    g_pDevice->SetRenderState(D3DRS_FOGCOLOR, Color);
    
    // Set fog parameters.
    if( Mode == D3DFOG_LINEAR )
    {
        g_pDevice->SetRenderState(D3DRS_FOGTABLEMODE, Mode);
        g_pDevice->SetRenderState(D3DRS_FOGSTART, *(DWORD *)(&Start));
        g_pDevice->SetRenderState(D3DRS_FOGEND,   *(DWORD *)(&End));
    }
    else
    {
        g_pDevice->SetRenderState(D3DRS_FOGTABLEMODE, Mode);
        g_pDevice->SetRenderState(D3DRS_FOGDENSITY, *(DWORD *)(&Density));
    }

即使 IDirect3DDevice9::SetRenderState 方法只接受第二個參數中的 DWORD 值,某些模糊參數還是需要做為浮點值。 上述範例會藉由將浮點變數的位址轉換成 DWORD 指標,然後將浮點變數的位址轉換成 DWORD 指標,然後將浮點變數的位址轉換為 IDirect3DDevice9::SetRenderState ,然後加以取值。

水氣類型