Microsoft Visual Studio .NET 2003 Microsoft DirectX 9.0 SDK (December 2004) |
■アンチエイリアシング | Prev Top Next |
今回はアンチエイリアシングです。
アンチエイリアシングは、オブジェクトの輪郭付近に発生するジャギー(ぎざぎざ)をぼかして目立たなくする処理です。
解像度を低くしてフルスクリーンモードで実行するとジャギーが顕著になるためアンチエイリアシングを適応してレンダリング品質を向上させます。
ただ逆をいえば解像度を高くすればジャギーが目立たなくなるので、個人的にはアンチエイリアシングなど使用せず解像度を上げたほうがいいと思ってます。アンチエイリアシングは負荷も高いし。
まあそうはいっても、機能としてあるので一応紹介します。
---Main.cpp---
//LPDIRECT3D9 m_pdirect3d9; //LPDIRECT3DDEVICE9 m_pd3dDevice; //D3DPRESENT_PARAMETERS m_d3dParameters; //HWND HWnd; int APIENTRY WinMain( HINSTANCE hInstance, HINSTANCE /*hPrevInstance*/, LPSTR /*lpCmpLine*/, INT /*nCmdShow*/) { HRESULT hr; //**************************************************************** //ここでウィンドウクラスの登録処理とウィンドウの作成を行う。 //**************************************************************** //**************************************************************** //ここでLPDIRECT3D9を作成する //**************************************************************** //次にD3DPRESENT_PARAMETERS構造体の設定を行う ZeroMemory(&m_d3dParameters, sizeof(D3DPRESENT_PARAMETERS)); m_d3dParameters.BackBufferCount = 1; m_d3dParameters.Windowed = TRUE; m_d3dParameters.BackBufferWidth = 640; m_d3dParameters.BackBufferHeight = 480; m_d3dParameters.EnableAutoDepthStencil = TRUE; m_d3dParameters.SwapEffect = D3DSWAPEFFECT_DISCARD; m_d3dParameters.hDeviceWindow = HWnd; m_d3dParameters.BackBufferFormat = D3DFMT_X8R8G8B8; m_d3dParameters.AutoDepthStencilFormat = D3DFMT_D16; //D3DPRESENT_PARAMETERS構造体に設定した内容でアンチエイリアシングが使用可能かチェックする。 hr = CheckAntialias( D3DMULTISAMPLE_16_SAMPLES ); //**************************************************************** //ここでLPDIRECT3DDEVICE9の作成を行う //**************************************************************** //アンチエイリアシングが使用可能なときはレンダーステートのアンチエイリアシングを有効にする。 if( SUCCEEDED( hr ) ) m_pd3dDevice->SetRenderState( D3DRS_MULTISAMPLEANTIALIAS, TRUE ); else m_pd3dDevice->SetRenderState( D3DRS_MULTISAMPLEANTIALIAS, FALSE ); //**************************************************************** //ここでメッセージループ処理を行う。 //**************************************************************** } //アンチエイリアシングが使用できるかチェックし、使用できるタイプをD3DPRESENT_PARAMETERS構造体に格納する。 HRESULT CheckAntialias( D3DMULTISAMPLE_TYPE AntialiasMode ) { HRESULT hr = E_FAIL; DWORD QualityBackBuffer = 0; DWORD QualityZBuffer = 0; DWORD m = (DWORD)AntialiasMode; while( m ) { //レンダリングターゲットでアンチエイリアシングがサポートされているかをチェック hr = m_pDirect3D9->CheckDeviceMultiSampleType( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, m_d3dParameters.BackBufferFormat, m_d3dParameters.Windowed, (D3DMULTISAMPLE_TYPE)m, &QualityBackBuffer ); if( SUCCEEDED(hr) ) { //深度ステンシル サーフェイスでアンチエイリアシングがサポートされているかをチェック hr = m_pDirect3D9->CheckDeviceMultiSampleType( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, m_d3dParameters.AutoDepthStencilFormat, m_d3dParameters.Windowed, (D3DMULTISAMPLE_TYPE)m, &QualityZBuffer ); if( SUCCEEDED(hr) ) { //アンチエイリアシングが使用できるのでD3DPRESENT_PARAMETERSにタイプをセットする。 m_d3dParameters.MultiSampleType = (D3DMULTISAMPLE_TYPE)m; //QualityBackBufferとQualityZBufferで小さい方の値を有効にする。どんなパターンで値が返るのかわからんので、こうしたほうが安全かと。 if( QualityBackBuffer < QualityZBuffer ) m_d3dParameters.MultiSampleQuality = QualityBackBuffer - 1; else m_d3dParameters.MultiSampleQuality = QualityZBuffer - 1; break; } } //現在のタイプでアンチエイリアシングが使用できないので、1段階低いタイプで再チェックする。 m--; } return hr; }
レンダリング結果です。右の画像がアンチエイリアシングを有効にしています。オブジェクトの輪郭がぼけているのが確認できると思います。
ではプログラムの解説です。CheckAntialias関数内でアンチエイリアシングが使用できるタイプを選択し、D3DPRESENT_PARAMETERS構造体に格納しています。 関数内では、IDirect3D9::CheckDeviceMultiSampleTypeを繰り返し実行し、使用可能なタイプを選択しています。この設計は、出来るだけ高品質のレンダリングを 行えるようにすることを目的としています。結構重要です。
またレンダーターゲット サーフェイスを使用してバックバッファ以外のサーフェイスにレンダリングを行った場合、アンチエイリアシングを有効にすると正しくレンダリングされませんでした。 オンラインマニュアルによるとマルチレンダーターゲットの場合アンチエイリアシングはサポートしないとありますが、シングルレンダーターゲットの場合もサポートされていないのかなあ。それとも環境のせいか。ちょっとこの辺不明です。
最後に冒頭にも書きましたが、アンチエイリアシングは重いです。設定でOn,Offの変更が出来るようにしたほうが親切だと思います。