D3D基本三角形面的繪製

來源:互聯網
上載者:User

 

#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;}

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.