- 追加された行はこの色です。
- 削除された行はこの色です。
今回はとりあえず画像描画してみたいと思います(やっとかよー)
まず、前回作成したプロパティシートを今回のプロジェクトがあるフォルダにコピーします
プロパティシートをプロジェクトに追加します
&ref(prop.jpg);
今回以降、DirectXを使う場合はこのプロパティシートを同じように追加してください
-----------------------------------------------------------------------
今回使うファイルは次のようになってます。どぞー(-ω-)つ旦
・&ref(sprite.cpp);
・&ref(car.bmp);
zipでほしい人はこちら
・&ref(sprite.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デバイス作成失敗(このグラフィックボードではDirectXが使えない)
pD3D9->Release();
return -1;
}
///////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////
// テクスチャ作成
////////////////////////////////
IDirect3DTexture9* pTexture = NULL;
// 画像読み込み(本当は画像ファイルがあるかのチェックもすべき)
D3DXCreateTextureFromFile(pDevice3D,_T("car.bmp"),&pTexture);
////////////////////////////////
// スプライト作成
////////////////////////////////
struct Vertex{
float x,y,z;// 3次元座標
float rhw; // 2D変換済みフラグ
float u,v; // UV座標
};
// FVF(柔軟な頂点構造体宣言)フラグ
static const DWORD SPRITE_FVF = D3DFVF_XYZRHW | D3DFVF_TEX1;
// スプライト位置
D3DXVECTOR2 pos;
pos.x = WINDOW_WIDTH/2.0f;
pos.y = WINDOW_HEIGHT/2.0f;
// スプライトサイズ
int width = 256;
int height = 256;
Vertex vtx[4]={
{ pos.x + width/2, pos.y - height/2, 0.0f, 1.0f, 1.0f, 0.0f},
{ pos.x + width/2, pos.y + height/2, 0.0f, 1.0f, 1.0f, 1.0f},
{ pos.x - width/2, pos.y - height/2, 0.0f, 1.0f, 0.0f, 0.0f},
{ pos.x - width/2, pos.y + height/2, 0.0f, 1.0f, 0.0f, 1.0f}
};
///////////////////////////////////////////////////////////////////////////////////////////////
// メッセージループ
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->SetTexture(0,pTexture);
// 頂点構造体宣言セット
pDevice3D->SetFVF(SPRITE_FVF);
// スプライト描画
pDevice3D->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP,2,vtx,sizeof(Vertex));
///////////////////////////////////////////////////////////////////////////////////////////////
// 描画終了
pDevice3D->EndScene();
}
// 描画反映
pDevice3D->Present( NULL, NULL, NULL, NULL );
}
}
// DirectXの変数は必ず後処理をすること
///////////////////////////////////////////////////////////////////////////////////////////////
pTexture->Release(); // テクスチャ解放も忘れずに!!
///////////////////////////////////////////////////////////////////////////////////////////////
pDevice3D->Release();
pD3D9->Release();
return 0;
}
実行すると下手な絵が出ます(気に食わなかったら画像ファイル差し替えてください)
&ref(sprite.jpg);
描画処理についてです
D3DXCreateTextureFromFile関数で画像を読み込みます
IDirect3DTexture9インターフェースにリソースへのポインタを取得します
使い終わったらReleaseで解放しなければなりません
DirectXで画像を描くには四角形ポリゴンに画像を貼り付けます
四角形ポリゴンにするためには三角形ポリゴンを2枚描きます
自作のVertex構造体を作成します
スプライトとは画像を貼り付ける2次元板ポリゴンのことです
頂点の位置が3次元データですが、2次元ぽく見せる処理をします
・描画部分は次の三行です
// テクスチャセット
pDevice3D->SetTexture(0,pTexture);
// 頂点構造体宣言セット
pDevice3D->SetFVF(SPRITE_FVF);
// スプライト描画
pDevice3D->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP,2,vtx,sizeof(Sprite));
前:DirectX講座6回
次:DirectX講座8回
#vote((^q^)余裕でした[0],ダホマ[4],ねるねるねるねは練れば練るほど、ヒッヒッヒ・・・うまい!テーレッテレー[4])
#vote((^q^)余裕でした[1],ダホマ[5],ねるねるねるねは練れば練るほど、ヒッヒッヒ・・・うまい!テーレッテレー[5])