D3DMでポリゴン描画(テクスチャ編
Main.cpp
#include <windows.h> #include <d3dm.h.> #include <d3dmx.h> #include "resource.h" #pragma comment(lib, "d3dm.lib") #pragma comment(lib, "d3dmx.lib") LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); #define PROC_NAME L"ProcSample10" bool InitD3dm( HWND ); void ExitD3dm( void ); void Render( void ); //---------------------------------------------------------------- int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPreInst, LPWSTR lpszCmdLine, int nCmdShow ) { HWND hwnd; MSG msg; WNDCLASS myProg; if (!hPreInst) { myProg.style = CS_HREDRAW | CS_VREDRAW; myProg.lpfnWndProc = WndProc; myProg.cbClsExtra = 0; myProg.cbWndExtra = 0; myProg.hInstance = hInstance; myProg.hIcon = NULL; myProg.hCursor = NULL; myProg.hbrBackground = (HBRUSH)COLOR_WINDOW; myProg.lpszMenuName = NULL; myProg.lpszClassName = PROC_NAME; if (!RegisterClass( &myProg )){ return FALSE; } } hwnd = CreateWindow( PROC_NAME, L"Sample10", WS_OVERLAPPED | WS_SYSMENU | WS_CAPTION, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL); if( InitD3dm( hwnd ) == false ) return FALSE; ShowWindow( hwnd, nCmdShow ); UpdateWindow( hwnd ); do{ if(PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE )) { TranslateMessage( &msg ); DispatchMessage( &msg ); }else{ Render(); } } while(msg.message != WM_QUIT); ExitD3dm(); return (int)( msg.wParam ); } //---------------------------------------------------------------- LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam ) { switch (msg) { case WM_DESTROY: ExitD3dm(); PostQuitMessage( 0 ); break; default: return(DefWindowProc( hwnd, msg, wParam, lParam )); } return (0L); } //================================================================ //D3DM 関係 // 頂点配列 struct VERTEX { FLOAT x, y, z; DWORD color; FLOAT u, v; static const DWORD FVF; }; const DWORD VERTEX::FVF = D3DMFVF_XYZ_FLOAT | D3DMFVF_DIFFUSE | D3DMFVF_TEX1; #define SAFE_RELEASE(o) {if(o){o->Release();o = NULL;}} IDirect3DMobile* gPd3d = NULL; // Direct3Dオブジェクト IDirect3DMobileDevice* gPd3dmDevice = NULL; // Direct3Dデバイス IDirect3DMobileVertexBuffer* gPVB = NULL; // 頂点バッファ IDirect3DMobileTexture* gPTexture = NULL; // テクスチャ //---------------------------------------------------------------- bool InitD3dm( HWND hwnd) { HRESULT hr = S_OK; if(!(gPd3d = Direct3DMobileCreate( D3DM_SDK_VERSION ))) return false; D3DMPRESENT_PARAMETERS d3dmpp; memset( &d3dmpp, 0, sizeof(d3dmpp) ); d3dmpp.Windowed = true; // ウィンドウモード d3dmpp.SwapEffect = D3DMSWAPEFFECT_DISCARD; // フォーマット d3dmpp.BackBufferFormat = D3DMFMT_R5G6B5; d3dmpp.EnableAutoDepthStencil = TRUE; d3dmpp.AutoDepthStencilFormat = D3DMFMT_D16; // Zバッファが16bit // デバイスの生成 hr = gPd3d->CreateDevice( D3DMADAPTER_DEFAULT, D3DMDEVTYPE_DEFAULT, hwnd, 0, &d3dmpp, &gPd3dmDevice ); if( hr != S_OK ) return true; // VRAMに頂点バッファを置くことが可能かどうか? D3DMCAPS caps; D3DMPOOL vbpool; if (caps.SurfaceCaps & D3DMSURFCAPS_VIDVERTEXBUFFER){ vbpool = D3DMPOOL_VIDEOMEM; }else{ vbpool = D3DMPOOL_SYSTEMMEM; } // 頂点バッファの作成 if(FAILED(gPd3dmDevice->CreateVertexBuffer( sizeof(VERTEX)*4, 0, VERTEX::FVF, vbpool, &gPVB ))) return false; // 頂点のセット VERTEX V[] = { -1.0f, 1.0f, 0.0f, 0xffffffff, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0xffffffff, 1.0f, 0.0f, -1.0f, -1.0f, 0.0f, 0xffffffff, 0.0f, 1.0f, 1.0f, -1.0f, 0.0f, 0xffffffff, 1.0f, 1.0f }; VOID* pV; if(FAILED(gPVB->Lock( 0, 0, &pV, 0))) return false; // 頂点データのコピー memcpy( pV, V, sizeof( V )); gPVB->Unlock(); //テクスチャ設定 D3DMPOOL texpool; if (caps.SurfaceCaps & D3DMSURFCAPS_VIDTEXTURE){ texpool = D3DMPOOL_VIDEOMEM; // VRAM }else{ texpool = D3DMPOOL_SYSTEMMEM; // システムRAM } if( FAILED( D3DMXCreateTextureFromResourceEx( gPd3dmDevice, GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_BITMAP1), D3DMX_DEFAULT, D3DMX_DEFAULT, 1, 0, D3DMFMT_UNKNOWN, texpool, D3DMX_FILTER_POINT, D3DMX_FILTER_POINT, 0, NULL, NULL, &gPTexture ) ) ){ return false; } //------------------------------------------- gPd3dmDevice->SetRenderState( D3DMRS_LIGHTING, FALSE ); gPd3dmDevice->SetRenderState( D3DMRS_CULLMODE, D3DMCULL_NONE ); return true; } //---------------------------------------------------------------- void ExitD3dm() { SAFE_RELEASE( gPTexture ); SAFE_RELEASE( gPVB ); SAFE_RELEASE( gPd3dmDevice ); SAFE_RELEASE( gPd3d ); } //---------------------------------------------------------------- void Render() { HRESULT hr = S_OK; static int rollY = 0; // バックバッファとZバッファのクリア gPd3dmDevice->Clear(0, NULL, D3DMCLEAR_TARGET | D3DMCLEAR_ZBUFFER, D3DMCOLOR_XRGB(0,0,0), 1.0f, 0); // 描画開始 if(SUCCEEDED(gPd3dmDevice->BeginScene())) { rollY += 1; // ビュー行列(3D空間のカメラ) D3DMXVECTOR3 vEyePt( 0.0f, 0.0f, -4.0f ); D3DMXVECTOR3 vLookatPt( 0.0f, 0.0f, 0.0f ); D3DMXVECTOR3 vUpVec( 0.0f, 1.0f, 0.0f ); D3DMXMATRIX matView; D3DMXMatrixLookAtLH( &matView, &vEyePt, &vLookatPt, &vUpVec ); gPd3dmDevice->SetTransform( D3DMTS_VIEW, (D3DMMATRIX*)&matView, D3DMFMT_D3DMVALUE_FLOAT ); // Y軸回転 D3DMXMATRIX matWorld; D3DMXMatrixRotationY( &matWorld, D3DMXToRadian( rollY ) ); gPd3dmDevice->SetTransform( D3DMTS_WORLD, (D3DMMATRIX*)&matWorld, D3DMFMT_D3DMVALUE_FLOAT ); // アスペクト比の調整はしない D3DMXMATRIX matProj; D3DMXMatrixPerspectiveFovLH( &matProj, D3DMX_PI/4.0f, 1.0f, 0.1f, 100.0f ); gPd3dmDevice->SetTransform( D3DMTS_PROJECTION, (D3DMMATRIX*)&matProj, D3DMFMT_D3DMVALUE_FLOAT ); // テクスチャ設定 hr = gPd3dmDevice->SetTexture( 0, gPTexture ); // 頂点バッファからレンダリング hr = gPd3dmDevice->SetStreamSource(0, gPVB, sizeof(VERTEX)); hr = gPd3dmDevice->DrawPrimitive(D3DMPT_TRIANGLESTRIP, 0, 2); hr = gPd3dmDevice->SetTexture( 0, NULL ); gPd3dmDevice->EndScene(); } // スクリーンへの転送 hr = gPd3dmDevice->Present(NULL, NULL, NULL, NULL); }
これくらいなら、実機(T01A)でもサクサク動きます。