Поделиться через


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)

Чтобы использовать мультисемплинг, необходимо задать для параметра SwapEffect структуры D3DPRESENT_PARAMETER значение D3DSWAPEFFECT_DISCARD.

Последний шаг — включить многосемплинговое сглаживание путем вызова метода IDirect3DDevice9::SetRenderState и задания D3DRS_MULTISAMPLEANTIALIAS TRUE. После установки значения TRUE, ко всем отрисовкам будет применяться мультисэмплинг. Может потребоваться включать и выключать мультисэмплинг в зависимости от того, что вы хотите отрисовать.

Сглаживание