コード:
#pragma comment(lib,"d3d9.lib")
#pragma comment(lib,"d3dx9.lib")
#include <Windows.h>
#include <d3d9.h>
#include <d3dx9.h>
#include <cassert>
#include <iostream>
#include <crtdbg.h>
//global
//win
HWND g_windowHandle = 0;
//dx
IDirect3D9* g_pD3D = 0;
IDirect3DDevice9* g_pD3DDevice = 0;
ID3DXEffect* g_pEffect = 0;
IDirect3DTexture9* g_pTexture = 0;
LRESULT CALLBACK WindowProcedure(HWND hWnd,UINT iMsg,WPARAM wParam,LPARAM lParam);
bool MessagePump();
int main(int argc,char* argv[])
{
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
const int WINDOW_WIDTH = 640;
const int WINDOW_HEIGHT = 480;
const int WINDOW_STYLE = WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX;
//win
const wchar_t* CLASS_NAME = L"CLASS1";
WNDCLASSW wndClass = {CS_HREDRAW|CS_VREDRAW,WindowProcedure,0,0,GetModuleHandleW(0),0,
(HCURSOR)LoadImageW(0,MAKEINTRESOURCEW(IDC_ARROW),IMAGE_CURSOR,0,0,LR_DEFAULTSIZE | LR_SHARED),0,0,CLASS_NAME};
RegisterClassW(&wndClass);
RECT rc = {0,0,WINDOW_WIDTH,WINDOW_HEIGHT};
AdjustWindowRect(&rc,WINDOW_STYLE,false);
g_windowHandle = CreateWindowW(CLASS_NAME,L"Form1",WINDOW_STYLE,0,0,rc.right-rc.left,rc.bottom-rc.top,0,0,GetModuleHandleW(0),0);
ShowWindow(g_windowHandle,SW_SHOW);
UpdateWindow(g_windowHandle);
//dx
g_pD3D = Direct3DCreate9(D3D_SDK_VERSION);
D3DPRESENT_PARAMETERS d3dpp = {WINDOW_WIDTH,WINDOW_HEIGHT,D3DFMT_UNKNOWN,1,D3DMULTISAMPLE_NONE,0,D3DSWAPEFFECT_DISCARD,
g_windowHandle,TRUE,TRUE,D3DFMT_D24X8,0,D3DPRESENT_RATE_DEFAULT,D3DPRESENT_RATE_DEFAULT};
{
HRESULT hr = 0;
if(FAILED( hr =g_pD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,g_windowHandle,D3DCREATE_HARDWARE_VERTEXPROCESSING,&d3dpp,&g_pD3DDevice) ))
{
if(FAILED( g_pD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,g_windowHandle,D3DCREATE_SOFTWARE_VERTEXPROCESSING,&d3dpp,&g_pD3DDevice) ))
{
return EXIT_FAILURE;
}
}
}
//Init
unsigned CREATE_EFFECT_FLAGS = 0;
#ifndef NDEBUG
CREATE_EFFECT_FLAGS |= D3DXSHADER_DEBUG;
#endif
ID3DXBuffer* error = 0;
if(FAILED( D3DXCreateEffectFromFileA(
g_pD3DDevice,
"effect.fx",
NULL,
NULL,
CREATE_EFFECT_FLAGS,
NULL,
&g_pEffect,
&error) ))
{
if(error)
{
std::cout << reinterpret_cast<char*>( error->GetBufferPointer() ) << std::endl;
error->Release();
error = 0;
}
assert(0);
}
if(FAILED( D3DXCreateTextureFromFileA(g_pD3DDevice,"texture.png",&g_pTexture) ))
{
assert(0);
}
while(MessagePump())
{
g_pD3DDevice->Clear(0,NULL,D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,0x0,1.0f,0);
g_pD3DDevice->BeginScene();
struct Vertex{
float x,y,z;
float u,v;
};
Vertex vertices[4] = {
{-0.9f, 0.9f,0, 0,0},
{ 0.9f, 0.9f,0, 1.f,0},
{-0.9f,-0.9f,0, 0,1.f},
{ 0.9f,-0.9f,0, 1.f,1.f},
};
g_pD3DDevice->SetFVF(D3DFVF_XYZ | D3DFVF_TEX1);
D3DXMATRIX wvp;
D3DXMatrixIdentity(&wvp);
g_pEffect->SetMatrix("mWVP",&wvp);
g_pEffect->SetTexture("Tex",g_pTexture);
g_pEffect->SetTechnique("TShader");
unsigned numPass = 0;
g_pEffect->Begin(&numPass,0);
g_pEffect->BeginPass(0);
g_pD3DDevice->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP,2,vertices,sizeof(Vertex));
g_pEffect->EndPass();
g_pEffect->End();
g_pD3DDevice->EndScene();
g_pD3DDevice->Present(0,0,0,0);
}
if(g_pTexture)
{
g_pTexture->Release();
g_pTexture = 0;
}
if(g_pEffect)
{
g_pEffect->Release();
g_pEffect = 0;
}
if(g_pD3DDevice)
{
g_pD3DDevice->Release();
g_pD3DDevice = 0;
}
if(g_pD3D)
{
g_pD3D->Release();
g_pD3D = 0;
}
DestroyWindow(g_windowHandle);
g_windowHandle = 0;
UnregisterClassW(CLASS_NAME,GetModuleHandleW(0));
return EXIT_SUCCESS;
}
bool MessagePump()
{
MSG msg = {0};
if(PeekMessageW(&msg,NULL,0U,0U,PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessageW(&msg);
}
return msg.message != WM_QUIT;
}
LRESULT CALLBACK WindowProcedure(HWND hWnd,UINT iMsg,WPARAM wParam,LPARAM lParam)
{
if(iMsg == WM_DESTROY){PostQuitMessage(0);}
return DefWindowProc(hWnd,iMsg,wParam,lParam);
}