Full-Scene抗锯齿 (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 后,所做的任何呈现都将应用多重采样。 可能需要启用和禁用多重采样,具体取决于要呈现的内容。

抗锯齿