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 后,将应用多重采样的任何呈现。 可能需要根据呈现的内容启用和禁用多重采样。

抗锯齿