#include "../../GameEngine/GameEngine_Common.h"
#include "Triangle.h"
CTriangle::CTriangle(){}
CTriangle::~CTriangle()
{
Direct3DRelease();
}
bool CTriangle::CreateD3DDevice(HWND hWnd,bool bFullScreen)
{
//建立IDirect3D9對象
m_pIDirect3D=Direct3DCreate9(D3D_SDK_VERSION);
if(m_pIDirect3D==NULL)
{
return false;
}
D3DCAPS9 d3dcaps;
m_pIDirect3D->GetDeviceCaps(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,&d3dcaps);
bool bHarwareProcess;
if(d3dcaps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT)
{
bHarwareProcess=true;
}
else{
bHarwareProcess=false;
}
//取得顯示模式
D3DDISPLAYMODE d3dDisplayMode;
if(FAILED(m_pIDirect3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &d3dDisplayMode)))
{
return false;
}
//設定d3d裝置的渲染參數
D3DPRESENT_PARAMETERS d3dPresent_Param; //渲染參數結構體
ZeroMemory(&d3dPresent_Param, sizeof(d3dPresent_Param)); //結構體清0
d3dPresent_Param.BackBufferWidth=800;
d3dPresent_Param.BackBufferHeight=600;
d3dPresent_Param.BackBufferFormat=d3dDisplayMode.Format;
d3dPresent_Param.BackBufferCount=1; //一個後繪圖表面
d3dPresent_Param.hDeviceWindow=hWnd; //
d3dPresent_Param.Windowed=!bFullScreen; //false為全螢幕顯示方式
d3dPresent_Param.SwapEffect=D3DSWAPEFFECT_FLIP;
d3dPresent_Param.PresentationInterval=D3DPRESENT_INTERVAL_DEFAULT;
//建立d3d裝置
if(bHarwareProcess)
{
if(FAILED(m_pIDirect3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
D3DCREATE_HARDWARE_VERTEXPROCESSING, &d3dPresent_Param,
&m_pIDirect3DDevice)))
{
return false;
}
}
else
{
if(FAILED(m_pIDirect3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dPresent_Param,
&m_pIDirect3DDevice)))
{
return false;
}
}
return true;
}
bool CTriangle::InitVertexBuffer()
{
CUSTOMVERTEX customVertex[]=
{
{0.0f, 0.0f, 0.0f, 1.0f, D3DCOLOR_XRGB(255, 0, 0)},
{800.0f,0.0f,10.8f, 1.0f, D3DCOLOR_XRGB(0, 255, 0)},
{800.0f,600.0f,30.0f, 1.0f, D3DCOLOR_XRGB(0, 0, 255)}
};
BYTE* pVertexData;
//建立頂點緩衝區
if(FAILED(m_pIDirect3DDevice->CreateVertexBuffer(3 * sizeof(CUSTOMVERTEX),0,
CUSTOMVERTEX_FVF, D3DPOOL_MANAGED, &m_pVertexBuffer,NULL)))
//參數FVF(Flexible Vertex Format)提供自訂的頂點的格式說明,以便解讀頂點的資料。
{
return false;
}
//取得頂點緩衝區的指標
if(FAILED(m_pVertexBuffer->Lock(0, 0, (void**)&pVertexData, 0)))
{
return false;
}
//寫入頂點資料到頂點緩衝區
memcpy(pVertexData, customVertex, sizeof(customVertex));
//解鎖
m_pVertexBuffer->Unlock();
return true;
}
void CTriangle::Render()
{
if(m_pIDirect3DDevice==NULL)
{
return;
}
//清空繪圖表面的BackBuffer為黑色
m_pIDirect3DDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);
//開始渲染
m_pIDirect3DDevice->BeginScene();
//渲染三角形面
m_pIDirect3DDevice->SetStreamSource(0, m_pVertexBuffer, 0, sizeof(CUSTOMVERTEX));
m_pIDirect3DDevice->SetFVF(CUSTOMVERTEX_FVF);
m_pIDirect3DDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1);
//結束渲染
m_pIDirect3DDevice->EndScene();
//置換前後繪圖表面緩衝區,顯示當前幀
m_pIDirect3DDevice->Present(NULL, NULL, NULL, NULL);
}
void CTriangle::Direct3DRelease()
{
SafeRelease(m_pVertexBuffer);
SafeRelease(m_pIDirect3DDevice);
SafeRelease(m_pIDirect3D);
}
#ifndef Triangle_Include#define Triangle_Include#define CUSTOMVERTEX_FVF (D3DFVF_XYZRHW|D3DFVF_DIFFUSE)struct CUSTOMVERTEX{ float x, y, z,rhw; D3DCOLOR color; //typedef DWORD D3DCOLOR};class CTriangle{private:IDirect3D9* m_pIDirect3D;IDirect3DDevice9* m_pIDirect3DDevice;IDirect3DVertexBuffer9* m_pVertexBuffer;public:CTriangle();~CTriangle();bool CreateD3DDevice(HWND,bool bFullScreen=true);bool InitVertexBuffer();void Render();void Direct3DRelease();};#endif#include "../../GameEngine/GameEngine_Common.h"#include "../../GameEngine/GameEngine_App/GameEngine_App.h"#include "../../GameEngine/GameEngine_Input/GameEngine_Input.h"#include "Triangle.h"int APIENTRY WinMain(HINSTANCE hInstance, //傳入的視窗控制代碼 HINSTANCE hPrevInstance, //已存在的視窗控制代碼 LPSTR lpCmdLine, //傳入的命令列參數 int nCmdShow) //設定視窗的顯示方式{CGameEngine_App GameEngine_App;CGameEngine_Input GameEngine_Input;CTriangle Triangle;HWND hWnd;MSG msg;if(!GameEngine_App.CreateWnd("基本三角形面的繪製",hInstance,hPrevInstance,nCmdShow)){return false;}hWnd=GameEngine_App.GetHWnd(); //取得已建立的視窗控制代碼if(!GameEngine_Input.CreateInput(hInstance,hWnd)){ //初始化輸入裝置MessageBox(NULL,"初始化輸入裝置失敗.","警告",MB_OK|MB_ICONINFORMATION);return false;}SetWindowPos(hWnd,0,0,0,0,0,SWP_NOSIZE); //設定應用程式視窗位置SetCursorPos(0,0); //設定滑鼠初始位置if(!Triangle.CreateD3DDevice(hWnd,false)){ //暫時不採用全螢幕return false;}if(!Triangle.InitVertexBuffer()){return false;}while(msg.message!=WM_QUIT){if(PeekMessage(&msg,NULL,0,0,PM_REMOVE)){TranslateMessage(&msg);DispatchMessage(&msg);}else{//讀取鍵盤輸入if(GameEngine_Input.ReadKeyboard()){if(GameEngine_Input.IsKeyPressed(DIK_R))Triangle.Render(); //按“R”鍵,進行渲染if(GameEngine_Input.IsKeyPressed(DIK_ESCAPE))PostQuitMessage(0); //按“ESC”鍵,退出程式}}}//登出視窗類別UnregisterClass(WNDCLASSNAME, hInstance);return true;}