今回は描画する前準備をします
つまらないですが、必須の処理になります

まず、DirectXをプロジェクトで使えるようにします
プロパティマネージャを表示します

prop1.jpg

新規のプロパティシートを追加します

prop2.jpg

名前を決めて追加します

prop3.jpg

追加したプロパティシートをダブルクリックします

prop4.jpg

「C/C++」→「全般」→「追加のインクルードディレクトリ」をクリックし
C:\Program Files\Microsoft DirectX SDK (June 2010)\Include
ディレクトリを選択し、インクルードディレクトリのパスをセットします

prop5.jpg

「リンカー」→「全般」→「追加のライブラリディレクトリ」をクリックし
C:\Program Files\Microsoft DirectX SDK (June 2010)\Lib\x86
ディレクトリを選択し、ライブラリディレクトリのパスをセットします

prop6.jpg

追加し終わったら「OK」を押してプロパティシートを閉じてください
これで設定完了です

次回からは今回作成したプロパティシートをコピーして
プロジェクトに追加するだけでDirectXを使う設定ができます


今回も描画処理の本質部分でないのでコピペでかまいません

今回使うファイルは次のようになってます。どぞー(-ω-)つ旦
filedirect3d.cpp
zipでほしい人はこちら
filedirect3d.zip

////////////////////////////////////////////
// Direct3Dに必要なヘッダーとライブラリ

#define D3D_DEBUG_INFO	// Direct3Dデバックフラグ

#pragma comment(lib, "d3d9.lib")
#pragma comment(lib, "d3dx9.lib")
#pragma comment(lib, "d3dxof.lib")
#pragma comment(lib, "dxguid.lib")
#pragma comment(lib, "winmm.lib")
#include <comdef.h>
#include <d3d9.h>
#include <d3dx9.h>
#include <mmsystem.h>
//////////////////////////////////////////////
#include <Windows.h>
#include <tchar.h>

// ウィンドウプロシージャ、ウィンドウに対するメッセージ処理を行う
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の初期化

	IDirect3D9*		pD3D9 = NULL;		// Direct3Dデバイス生成用オブジェクト
	IDirect3DDevice9*	pDevice3D = NULL;	// Direct3Dのデバイス

	// Direct3D9オブジェクトの作成	
	pD3D9 = Direct3DCreate9(D3D_SDK_VERSION);	
	// ディスプレイ情報取得
	D3DDISPLAYMODE Display;
	pD3D9->GetAdapterDisplayMode( D3DADAPTER_DEFAULT, &Display);

	D3DPRESENT_PARAMETERS	D3DParam = {			// スワップチェイン設定
		WINDOW_WIDTH,WINDOW_HEIGHT,Display.Format,1,D3DMULTISAMPLE_NONE,0,
		D3DSWAPEFFECT_DISCARD,hWnd,TRUE,TRUE,D3DFMT_D24S8,0,0,D3DPRESENT_INTERVAL_DEFAULT
	};			
	// HALモードで3Dデバイス作成
	if (FAILED(pD3D9->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL, D3DParam.hDeviceWindow,
		D3DCREATE_HARDWARE_VERTEXPROCESSING | D3DCREATE_MULTITHREADED, &D3DParam, &pDevice3D)))
	if (FAILED(pD3D9->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, D3DParam.hDeviceWindow,
		D3DCREATE_MIXED_VERTEXPROCESSING | D3DCREATE_MULTITHREADED, &D3DParam, &pDevice3D)))
	// REFモードで3Dデバイス作成
	if (FAILED(pD3D9->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_REF, D3DParam.hDeviceWindow, 
		D3DCREATE_HARDWARE_VERTEXPROCESSING | D3DCREATE_MULTITHREADED, &D3DParam, &pDevice3D)))
	if (FAILED(pD3D9->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_REF, D3DParam.hDeviceWindow, 
		D3DCREATE_SOFTWARE_VERTEXPROCESSING | D3DCREATE_MULTITHREADED, &D3DParam, &pDevice3D)))
	{
		// 3Dデバイス作成失敗
		pD3D9->Release();
		return -1;
	}
////////////////////////////////////////////////////////////////

	// メッセージループ
	MSG msg = {}; 
	while(msg.message != WM_QUIT) {
		// アプリケーションに送られてくるメッセージをメッセージキューから取得する
		if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)){
			DispatchMessage(&msg);	// アプリケーションの各ウィンドウプロシージャにメッセージを転送する
		}
		// メッセージ処理をしていないとき
		else{
			//(ここにDirectXの処理を書く)
//////////////////////////////////////////////////////////////////////////////

			// 描画開始
			if(SUCCEEDED(pDevice3D->BeginScene()))
			{
				DWORD ClearColor = 0xff808080;	// 背景クリア色
				// 背景クリア
				pDevice3D->Clear( 0, NULL, D3DCLEAR_TARGET | D3DCLEAR_STENCIL | D3DCLEAR_ZBUFFER, ClearColor, 1.0f, 0 );
			
				// 描画終了
				pDevice3D->EndScene();
			}
			// 描画反映
			pDevice3D->Present( NULL, NULL, NULL, NULL );
///////////////////////////////////////////////////////////////////////////////
		}
	}
///////////////////////////////////////////////////////////////////
	// DirectXの変数は必ず後処理をすること
	pDevice3D->Release();
	pD3D9->Release();	
////////////////////////////////////////////////////////////////////
	return 0;
}

今回の実行結果は次のようになります
描画デバイスを用いて画面を灰色で塗りつぶしました

device.jpg

今回はDirect3Dの初期化を行いました
非常に重要で必要な処理ですが、このまま使いまわしすることが多いので解説しません
少なくともこの講座では、この部分を書き換えることはしません

描画デバイスが作成できたら、後は描画デバイスを使って描画リソース(画像データ)の確保や描画処理を行います
次回はやっと画像を描画してみます

前:DirectX講座5回
次:DirectX講座7回

選択肢 投票
ヒュー! 21  
お許しください! 10  
特に意味はない 2  

添付ファイル: filedirect3d.zip 302件 [詳細] filedirect3d.cpp 451件 [詳細] fileprop6.jpg 391件 [詳細] fileprop5.jpg 472件 [詳細] fileprop4.jpg 323件 [詳細] fileprop3.jpg 390件 [詳細] fileprop2.jpg 502件 [詳細] fileprop1.jpg 475件 [詳細] filedevice.jpg 329件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2017-09-15 (金) 14:43:09