Full-Scene Antialiasing (Direct3D 9)

全場景反鋸齒是指將場景中每個多邊形的邊緣模糊化,因為它以單一階段點陣化;不需要第二次通過。 支援時,全場景反鋸齒只會影響三角形和三角形群組。 行無法使用 Direct3D 服務進行反鋸齒。 完整場景反鋸齒是在 Direct3D 中使用每個圖元上的多重取樣來完成。 啟用多重取樣時,圖元的所有子取樣都會在一階段中更新,但用於涉及多個轉譯階段的其他效果時,應用程式可以指定只有某些子取樣會受到指定轉譯階段的影響。 後者的方法可模擬動作模糊、現場深度焦點效果、反射模糊等等。

在這兩種情況下,針對每個圖元記錄的各種樣本會混合在一起,並輸出到畫面。 這可改善反鋸齒或其他效果的影像品質。

使用 IDirect3D9::CreateDevice 方法建立裝置之前,您必須判斷是否支援完整場景反鋸齒。 呼叫 IDirect3D9::CheckDeviceMultiSampleType 方法來執行此動作,如下列程式碼範例所示。

/*
* The code below assumes that pD3D is a valid pointer 
*   to a IDirect3D9 interface.
*/

if( SUCCEEDED(pD3D->CheckDeviceMultiSampleType( D3DADAPTER_DEFAULT, 
                    D3DDEVTYPE_HAL , D3DFMT_R8G8B8, FALSE, 
                    D3DMULTISAMPLE_2_SAMPLES, NULL ) ) )
// Full-scene antialiasing is supported. Enable it here.

IDirect3D9::CheckDeviceMultiSampleType接受的第一個參數是序數位,代表要查詢的顯示配接器。 此範例會使用 D3DADAPTER_DEFAULT 來指定主要顯示器介面卡。 第二個參數是 D3DDEVTYPE 列舉類型的值,指定裝置類型。 第三個參數會指定表面的格式。 第四個參數會告訴 Direct3D 是否要查詢全視窗式多重取樣 (TRUE) 或全場景反鋸齒 (FALSE) 。 此範例會使用 FALSE 來告知 Direct3D,其與全場景反鋸齒有關。 最後一個參數會指定您想要測試的多取樣技術。 使用來自 D3DMULTISAMPLE_TYPE 列舉型別的值。 此範例會測試以查看是否支援兩個層級的多取樣。

如果裝置支援您想要使用的多重取樣層級,下一個步驟是填入 D3DPRESENT_PARAMETERS 結構的適當成員來設定簡報參數,以建立多重取樣轉譯介面。 之後,您可以建立裝置。 下列範例程式碼示範如何使用多重取樣轉譯介面來設定裝置。

/*
* The example below assumes that pD3D is a valid pointer 
* to a IDirect3D9 interface, d3dDevice is a pointer to a 
* IDirect3DDevice9 interface, and hWnd is a valid handle
* to a window.
*/

D3DPRESENT_PARAMETER d3dPP
ZeroMemory( &d3dPP, sizeof( d3dPP ) );
d3dPP.Windowed        = FALSE
d3dPP.SwapEffect      = D3DSWAPEFFECT_DISCARD;
d3dPP.MultiSampleType = D3DMULTISAMPLE_2_SAMPLES;
pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
                    D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                    &d3dpp, &d3dDevice)

若要使用多重取樣,D3DPRESENT_PARAMETER的 SwapEffect 成員必須設定為 D3DSWAPEFFECT_DISCARD。

最後一個步驟是呼叫 IDirect3DDevice9::SetRenderState 方法,並將D3DRS_MULTISAMPLEANTIALIAS設定為 TRUE來啟用多重取樣反鋸齒。 將此值設定為 TRUE之後,您所做的任何轉譯都會套用多重取樣。 視您要轉譯的內容而定,您可能想要啟用和停用多重取樣。

反鋸齒