#include #include #include #include #include #pragma warning( disable : 4996 ) // 無駄な警告を出さなくする #include #pragma warning( default : 4996 ) //メモリリークを調べるために必要。 #if _DEBUG #include #define new ::new( _NORMAL_BLOCK, __FILE__, __LINE__ ) #endif #define WINDOW_WIDTH (640) // ウィンドウの幅 #define WINDOW_HEIGHT (480) // ウィンドウの高さ #define WINDOW_X ((WINDOW_WIDTH + GetSystemMetrics( SM_CXSIZEFRAME )*2)) #define WINDOW_Y ((WINDOW_HEIGHT + GetSystemMetrics( SM_CYSIZEFRAME )*2 + GetSystemMetrics( SM_CYCAPTION ))) #define SAFE_RELEASE(p) { if(p) { (p)->Release(); (p)=NULL; } } HINSTANCE g_hInstance = NULL; // インスタンス・ハンドル HWND g_hWindow = NULL; // ウインドウ・ハンドル LPDIRECT3D9 g_pD3D = NULL; // Direct3Dインタフェース LPDIRECT3DDEVICE9 g_pD3DDevice = NULL; // Direct3DDeviceインタフェース LPDIRECT3DTEXTURE9 g_pTexture = NULL; //テクスチャ LPDIRECT3DSURFACE9 g_pTexz = NULL; //テクスチャの深度バッファ LPDIRECT3DSURFACE9 g_pTexSurface = NULL; //テクスチャへアクセスする為のインターフェース LPDIRECT3DSURFACE9 g_pBackz = NULL; //バックバッファの深度バッファ LPDIRECT3DSURFACE9 g_pBackSurface = NULL; //バックバッファへアクセスする為の D3DXMATRIX g_proj; //グローバルな射影行列 D3DXMATRIX g_view; //グローバルなビュー行列 #define MY_VERTEX_FVF ( D3DFVF_XYZ | D3DFVF_DIFFUSE) struct MY_VERTEX{ float px, py, pz; DWORD color; }; #define MY_VERTEX2_FVF ( D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_TEX1 ) struct MY_VERTEX2{ float px, py, pz; DWORD color; float u, v; }; MY_VERTEX2 AspectBox[] = { {-1.0f, 1.0f,-1.0f, 0xffffaaaa, 0,0}, {-1.0f,-1.0f,-1.0f, 0xffaaffaa, 0,1}, { 1.0f, 1.0f,-1.0f, 0xffaaaff, 1,0}, { 1.0f,-1.0f,-1.0f, 0xffffffaa, 1,1}, { 1.0f, 1.0f, 1.0f, 0xffffaaaa, 0,0}, { 1.0f,-1.0f, 1.0f, 0xffaaffaa, 0,1}, {-1.0f, 1.0f, 1.0f, 0xffaaaaff, 1,0}, {-1.0f,-1.0f, 1.0f, 0xffffffaa, 1,1}, {-1.0f, 1.0f,-1.0f, 0xffffaaaa, 0,0}, {-1.0f,-1.0f,-1.0f, 0xffaaffaa, 0,1},}; //四角すい MY_VERTEX Pyramid[] = { { 0.0f, 2.0f, 0.0f, 0xffffffff}, {-1.0f, 0.0f, 1.0f, 0xffff0000}, { 1.0f, 0.0f, 1.0f, 0xff00ff00}, { 1.0f, 0.0f,-1.0f, 0xff0000ff}, {-1.0f, 0.0f,-1.0f, 0xffffff00}, {-1.0f, 0.0f, 1.0f, 0xffff0000}, }; //----------------------------------------------------------------------------- // Name: MsgProc() // Desc: The window's message handler //----------------------------------------------------------------------------- LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam ) { switch( msg ) { case WM_DESTROY: PostQuitMessage( 0 ); return 0; } return DefWindowProc( hWnd, msg, wParam, lParam ); } //----------------------------------------------------------------------------- // Name: InitApp() // Desc: Initialize Window //----------------------------------------------------------------------------- HRESULT InitApp(HINSTANCE hInstance) { g_hInstance = hInstance; WNDCLASSEX wcex ={sizeof(WNDCLASSEX), CS_HREDRAW | CS_VREDRAW, MsgProc, 0, 0, g_hInstance, NULL, NULL, (HBRUSH)(COLOR_WINDOW+1), NULL, L"D3D Tutorial", NULL}; if( !RegisterClassEx( &wcex )){ return DXTRACE_ERR(L"InitApp", GetLastError()); } // Create the application's window g_hWindow = CreateWindow( L"D3D Tutorial", L"ゲームプログラミング", WS_OVERLAPPEDWINDOW ^WS_THICKFRAME ^ WS_MAXIMIZEBOX ^ WS_MINIMIZEBOX, 100, 100, WINDOW_X, WINDOW_Y, NULL, NULL, wcex.hInstance, NULL ); if (g_hWindow == NULL) return DXTRACE_ERR(L"InitApp", GetLastError()); return S_OK; } //----------------------------------------------------------------------------- // Name: InitDirectX() // Desc: Initialize DirectX //----------------------------------------------------------------------------- HRESULT InitDirectX(void){ g_pD3D = Direct3DCreate9(D3D_SDK_VERSION); if(g_pD3D == NULL){ DXTRACE_MSG(L"DirectXDeviceの初期化に失敗しました"); return E_FAIL; } D3DDISPLAYMODE d3ddm; if(FAILED(g_pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &d3ddm))) { DXTRACE_MSG(L"DirectX3DDeviceの初期化に失敗しました"); return E_FAIL; } D3DPRESENT_PARAMETERS d3dpp; ZeroMemory(&d3dpp, sizeof(d3dpp)); d3dpp.Windowed = TRUE; d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; d3dpp.BackBufferFormat = D3DFMT_UNKNOWN; d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE; d3dpp.EnableAutoDepthStencil = TRUE; d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8; HRESULT hr = g_pD3D->CreateDevice( D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,g_hWindow, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp,&g_pD3DDevice); if(FAILED(hr)) { hr = g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL,g_hWindow, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp,&g_pD3DDevice); if(FAILED(hr)) { hr = g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_REF,g_hWindow, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp,&g_pD3DDevice); if(FAILED(hr)){ DXTRACE_MSG(L"DirectX3DDeviceの初期化に失敗しました"); return E_FAIL; } } } //セットアップ レンダーステート g_pD3DDevice->SetRenderState( D3DRS_LIGHTING, FALSE ); g_pD3DDevice->SetRenderState( D3DRS_DITHERENABLE, TRUE ); g_pD3DDevice->SetRenderState( D3DRS_ZENABLE, TRUE ); g_pD3DDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE ); g_pD3DDevice->SetRenderState( D3DRS_AMBIENT, 0x33333333 ); g_pD3DDevice->SetRenderState( D3DRS_NORMALIZENORMALS, TRUE ); g_pD3DDevice->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA ); g_pD3DDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA ); g_pD3DDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE ); g_pD3DDevice->SetSamplerState( 0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR ); g_pD3DDevice->SetSamplerState( 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR ); g_pD3DDevice->SetTextureStageState(0,D3DTSS_COLOROP, D3DTOP_MODULATE); g_pD3DDevice->SetTextureStageState(0,D3DTSS_COLORARG1, D3DTA_TEXTURE); g_pD3DDevice->SetTextureStageState(0,D3DTSS_COLORARG2, D3DTA_DIFFUSE); //ビュー行列作成 D3DXVECTOR3 vEyePt( 0.0f, 0.0f,-4.0f ); D3DXVECTOR3 vLookatPt( 0.0f, 0.0f, 0.0f ); D3DXVECTOR3 vUpVec( 0.0f, 1.0f, 0.0f ); D3DXMatrixLookAtLH( &g_view, &vEyePt, &vLookatPt, &vUpVec ); g_pD3DDevice->SetTransform( D3DTS_VIEW, &g_view ); //射影行列作成 D3DXMatrixPerspectiveFovLH( &g_proj, D3DXToRadian(90.0f), (float)640/480, 1.0f, 100.0f ); g_pD3DDevice->SetTransform( D3DTS_PROJECTION, &g_proj ); return S_OK; } //----------------------------------------------------------------------------- // Name: Uninitialize() // Desc: UnInitialize DirectX //----------------------------------------------------------------------------- void Uninitialize(void) { //デバイスなどを開放 SAFE_RELEASE(g_pBackSurface); SAFE_RELEASE(g_pBackz); SAFE_RELEASE(g_pTexSurface); SAFE_RELEASE(g_pTexture); SAFE_RELEASE(g_pTexz); SAFE_RELEASE(g_pD3DDevice); SAFE_RELEASE(g_pD3D); } //----------------------------------------------------------------------------- // Name: WinMain() // Desc: The application's entry point //----------------------------------------------------------------------------- int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { #ifdef _DEBUG _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); #endif HRESULT hr; if(FAILED(hr = InitApp(hInstance))) { return(0); } // Initialize Direct3D if( SUCCEEDED(hr = InitDirectX()) ) { MSG msg; ZeroMemory( &msg, sizeof(msg) ); ShowWindow(g_hWindow, SW_SHOWDEFAULT); UpdateWindow(g_hWindow); //新規テクスチャ作成***************************** g_pD3DDevice->CreateTexture( 128,128, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &g_pTexture, NULL); //新規テクスチャの深度バッファ作成*************** g_pD3DDevice->CreateDepthStencilSurface( 128,128, D3DFMT_D16, D3DMULTISAMPLE_NONE, 0, TRUE, &g_pTexz, NULL); //新規テクスチャへのインターフェース取得********* g_pTexture->GetSurfaceLevel(0, &g_pTexSurface); //バックバッファの情報を保存********************* D3DVIEWPORT9 viewport1; g_pD3DDevice->GetViewport(&viewport1); g_pD3DDevice->GetRenderTarget(0, &g_pBackSurface); g_pD3DDevice->GetDepthStencilSurface(&g_pBackz); // Enter the message loop while( msg.message!=WM_QUIT ) { if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) ) { TranslateMessage( &msg ); DispatchMessage( &msg ); }else{ g_pD3DDevice->BeginScene(); //レンダリングターゲット変更******************************* g_pD3DDevice->SetRenderTarget(0, g_pTexSurface); g_pD3DDevice->GetDepthStencilSurface(&g_pTexz); //変更したレンダリングターゲットのバッファなどをクリア***** g_pD3DDevice->Clear( 0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB( 255,255,255), 1.0f, 0 ); //ビューポートをセット************************************* D3DVIEWPORT9 viewport2 = { 0, 0, 128, 128, 0.0f, 1.0f}; g_pD3DDevice->SetViewport(&viewport2); //射影行列の設定******************************************* float aspect; aspect = (float)viewport2.Width / (float)viewport2.Height; D3DXMatrixIdentity(&g_proj); D3DXMatrixPerspectiveFovLH(&g_proj, D3DXToRadian(90.0f), aspect, 1.0f, 100.0f); g_pD3DDevice->SetTransform(D3DTS_PROJECTION, &g_proj); //ビュー行列の設定***************************************** D3DXMatrixIdentity(&g_view); D3DXMatrixLookAtLH( &g_view, &D3DXVECTOR3( 0.0f, 2.5f,-2.5f), &D3DXVECTOR3( 0.0f, 0.0f, 0.0f), &D3DXVECTOR3( 0.0f, 1.0f, 0.0f)); g_pD3DDevice->SetTransform(D3DTS_VIEW, &g_view); //テクスチャに描画***************************************** D3DXMATRIX mat; D3DXMatrixIdentity(&mat); static int n = 0; static int degree = 0; if((n = (n + 1) % 2) == 0) degree = (degree + 1) % 360; D3DXMatrixRotationY( &mat, D3DXToRadian(degree)); g_pD3DDevice->SetTransform(D3DTS_WORLD, &mat); g_pD3DDevice->SetTexture( 0, NULL); g_pD3DDevice->SetFVF(MY_VERTEX_FVF); g_pD3DDevice->DrawPrimitiveUP(D3DPT_TRIANGLEFAN, 4, Pyramid, sizeof(MY_VERTEX)); //レンダリングターゲットを元(バックバッファ)に戻す**** g_pD3DDevice->SetRenderTarget(0, g_pBackSurface); g_pD3DDevice->SetDepthStencilSurface(g_pBackz); //バックバッファの深度バッファなどをクリア g_pD3DDevice->Clear( 0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0,0,60), 1.0f, 0 ); //ビューポートをセット********************************** g_pD3DDevice->SetViewport(&viewport1); //射影行列の設定**************************************** D3DXMatrixIdentity(&g_proj); aspect = (float)viewport1.Width / (float)viewport1.Height; D3DXMatrixPerspectiveFovLH( &g_proj, D3DXToRadian(90.0f), aspect, 1.0f, 100.0f); g_pD3DDevice->SetTransform(D3DTS_PROJECTION, &g_proj); //ビュー行列の設定************************************** D3DXMatrixIdentity(&g_view); D3DXMatrixLookAtLH( &g_view, &D3DXVECTOR3( 0.0f, 2.0f,-3.0f), &D3DXVECTOR3( 0.0f, 0.0f, 0.0f), &D3DXVECTOR3( 0.0f, 1.0f, 0.0f)); g_pD3DDevice->SetTransform(D3DTS_VIEW, &g_view); //バックバッファに描画********************************** static int n2 = 0; static int degree2 = 0; if((n2 = (n2 + 1) % 6) == 0){ if(GetKeyState(VK_RIGHT) < 0){ degree2 = (degree2 + 1) % 360; }else if(GetKeyState(VK_LEFT) < 0){ }else{ degree2 = (degree2 + 359) % 360; } } D3DXMatrixRotationY( &mat, D3DXToRadian(degree2)); g_pD3DDevice->SetTransform(D3DTS_WORLD, &mat); g_pD3DDevice->SetTexture(0, g_pTexture); g_pD3DDevice->SetFVF(MY_VERTEX2_FVF); g_pD3DDevice->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 8, AspectBox, sizeof(MY_VERTEX2)); g_pD3DDevice->EndScene(); g_pD3DDevice->Present( NULL, NULL, NULL, NULL ); Sleep(1); } } } Uninitialize(); UnregisterClass( L"D3D Tutorial", g_hInstance ); return 0; }