今回は画像の背景領域を切り抜いて描画します 今回使うファイルは次のようになってます。どぞー(-ω-)つ旦 今回使う画像はこちら 背景領域を透明にしたい画像は画像編集ソフトであらかじめ背景領域を透明にしておいて zipでほしい人はこちら WinMain関数はalphatest.cppにあります #include <Windows.h> #include <tchar.h> #include "direct3d.h" #include "texture.h" #include "sprite.h" ////////////////////////////////////////////////////////////////////////////////////////////// // レンダーステートの設定 enum RENDERSTATE { RENDER_DEFAULT, // デフォルト(不透明) RENDER_ALPHATEST // αテスト }; // レンダーステートの変更 void SetRenderState(IDirect3DDevice9* pD3DDevice,RENDERSTATE RenderState){ switch(RenderState) { case RENDER_DEFAULT: { // 不透明オブジェクト pD3DDevice->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE); //アルファテストの無効化 } break; case RENDER_ALPHATEST: { // αテストによる透明領域の切り抜き pD3DDevice->SetRenderState(D3DRS_ALPHATESTENABLE, TRUE); //アルファテストの有効化 pD3DDevice->SetRenderState(D3DRS_ALPHAREF, 0x80); //アルファ参照値 pD3DDevice->SetRenderState(D3DRS_ALPHAFUNC, D3DCMP_GREATEREQUAL); //アルファテスト合格基準 } break; } } ////////////////////////////////////////////////////////////////////// // ウィンドウプロシージャ、ウィンドウに対するメッセージ処理を行う LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam){ switch(msg){ // ウィンドウが破棄されたとき case WM_DESTROY: PostQuitMessage(0); // WM_QUITメッセージをメッセージキューに送る return 0; } // デフォルトのメッセージ処理を行う return DefWindowProc(hWnd, msg, wParam, lParam); } // WinMain関数(アプリケーションの開始関数) // コンソールアプリケーションと違い、コンソールを開かない int _stdcall WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow) { const TCHAR* WC_BASIC = _T("BASIC_WINDOW"); // シンプルウィンドウクラス設定 WNDCLASSEX wcex ={sizeof(WNDCLASSEX), CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS,WndProc, 0,0,hInstance, (HICON)LoadImage(NULL,MAKEINTRESOURCE(IDI_APPLICATION),IMAGE_ICON,0,0,LR_DEFAULTSIZE | LR_SHARED), (HCURSOR)LoadImage(NULL,MAKEINTRESOURCE(IDC_ARROW),IMAGE_CURSOR,0,0,LR_DEFAULTSIZE | LR_SHARED), (HBRUSH)GetStockObject(WHITE_BRUSH), NULL, WC_BASIC , NULL}; // シンプルウィンドウクラス作成 if(!RegisterClassEx(&wcex)) return false; // ウィンドウ幅、高さはディスプレイに依存する。普通は4:3 const int WINDOW_WIDTH = 640; const int WINDOW_HEIGHT = 480; // ウィンドウの作成 HWND hWnd = CreateWindowEx(0,WC_BASIC, _T("Application"), WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_VISIBLE, CW_USEDEFAULT,CW_USEDEFAULT,WINDOW_WIDTH,WINDOW_HEIGHT,NULL,NULL,hInstance,NULL); /////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////// // Direct3Dの初期化 //////////////////////////////////// Direct3D direct3d; direct3d.Create(hWnd,WINDOW_WIDTH,WINDOW_HEIGHT); //////////////////////////////// // テクスチャ作成 //////////////////////////////// Texture skytex; Texture cartex; skytex.Load(direct3d.pDevice3D,_T("sky.bmp")); cartex.Load(direct3d.pDevice3D,_T("shooter.png")); //////////////////////////////// // スプライト作成 //////////////////////////////// Sprite sprite[2]; sprite[0].SetPos(WINDOW_WIDTH/2.0f,WINDOW_HEIGHT/2.0f); sprite[0].SetWidth(WINDOW_WIDTH,WINDOW_HEIGHT); sprite[1].SetPos(300,300); sprite[1].SetWidth(128,128); /////////////////////////////////////////////////////////////////////////////////////////////// // メッセージループ MSG msg = {}; while(msg.message != WM_QUIT) { // アプリケーションに送られてくるメッセージをメッセージキューから取得する if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)){ DispatchMessage(&msg); // アプリケーションの各ウィンドウプロシージャにメッセージを転送する } // メッセージ処理をしていないとき else{ //(ここにDirectXの処理を書く) /////////////////////////////////////////////////////////////////////////////////////////////// // 描画開始 if(SUCCEEDED(direct3d.pDevice3D->BeginScene())) { DWORD ClearColor = 0xff808080; // 背景クリア色 // 背景クリア direct3d.pDevice3D->Clear( 0, NULL, D3DCLEAR_TARGET | D3DCLEAR_STENCIL | D3DCLEAR_ZBUFFER, ClearColor, 1.0f, 0 ); // 透明領域を描画時切り抜きする設定 SetRenderState(direct3d.pDevice3D,RENDER_ALPHATEST); // スプライト描画 sprite[0].Draw(direct3d.pDevice3D,skytex.pTexture); sprite[1].Draw(direct3d.pDevice3D,cartex.pTexture); // 描画終了 direct3d.pDevice3D->EndScene(); } // 描画反映 direct3d.pDevice3D->Present( NULL, NULL, NULL, NULL ); /////////////////////////////////////////////////////////////////////////////////////////////// } } return 0; } 今回の実行結果は次のようになります アルファテストの設定がSetRenderState関数内にあります // αテストによる透明領域の切り抜き pD3DDevice->SetRenderState(D3DRS_ALPHATESTENABLE, TRUE); //アルファテストの有効化 pD3DDevice->SetRenderState(D3DRS_ALPHAREF, 0x80); //アルファ参照値 pD3DDevice->SetRenderState(D3DRS_ALPHAFUNC, D3DCMP_GREATEREQUAL); //アルファテスト合格基準 アルファ参照値にアルファ値(0〜255)の値を入れます 今回はアルファテスト有効を描画直前にしています // 透明領域を描画時切り抜きする設定 SetRenderState(direct3d.pDevice3D,RENDER_ALPHATEST);
|