国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

Direct3D的四大變換

2019-11-11 03:38:35
字體:
供稿:網(wǎng)友
//-----------------------------------【程序說明】----------------------------------------------// 程序名稱::D3Ddemo5// 2013年4月 Create by 淺墨// 描述:邁向三維世界:Direct3D四大變換 示例程序//------------------------------------------------------------------------------------------------//-----------------------------------【頭文件包含部分】---------------------------------------// 描述:包含程序所依賴的頭文件//------------------------------------------------------------------------------------------------#include <d3d9.h>#include <d3dx9.h>#include <tchar.h>//-----------------------------------【庫文件包含部分】---------------------------------------// 描述:包含程序所依賴的庫文件//------------------------------------------------------------------------------------------------#PRagma comment(lib,"winmm.lib") //調(diào)用PlaySound函數(shù)所需庫文件#pragma comment(lib,"d3d9.lib")#pragma comment(lib,"d3dx9.lib")//-----------------------------------【宏定義部分】--------------------------------------------// 描述:定義一些輔助宏//------------------------------------------------------------------------------------------------#define WINDOW_WIDTH 800 //為窗口寬度定義的宏,以方便在此處修改窗口寬度#define WINDOW_HEIGHT 600 //為窗口高度定義的宏,以方便在此處修改窗口高度#define WINDOW_TITLE L"【致我們永不熄滅的游戲開發(fā)夢想】邁向三維世界:Direct3D四大變換 示例程序" //為窗口標(biāo)題定義的宏#define SAFE_RELEASE(p) { if(p) { (p)->Release(); (p)=NULL; } } //定義一個(gè)安全釋放宏,便于后面COM接口指針的釋放//------------------------------------------------------------------------------------------------// 【頂點(diǎn)緩存、索引緩存繪圖四步曲之一】:設(shè)計(jì)頂點(diǎn)格式//------------------------------------------------------------------------------------------------struct CUSTOMVERTEX{ FLOAT x, y, z; DWord color;};//包含未經(jīng)坐標(biāo)變換的頂點(diǎn)坐標(biāo)值|包含漫反射的顏色值#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE) //FVF靈活頂點(diǎn)格式//-----------------------------------【全局變量聲明部分】-------------------------------------// 描述:全局變量的聲明//------------------------------------------------------------------------------------------------LPDIRECT3DDEVICE9 g_pd3dDevice = NULL; //Direct3D設(shè)備對象ID3DXFont* g_pFont=NULL; //字體COM接口float g_FPS = 0.0f; //一個(gè)浮點(diǎn)型的變量,代表幀速率wchar_t g_strFPS[50]; //包含幀速率的字符數(shù)組LPDIRECT3DVERTEXBUFFER9 g_pVertexBuffer = NULL; //頂點(diǎn)緩沖區(qū)對象LPDIRECT3DINDEXBUFFER9 g_pIndexBuffer = NULL; // 索引緩存對象//-----------------------------------【全局函數(shù)聲明部分】-------------------------------------// 描述:全局函數(shù)聲明,防止“未聲明的標(biāo)識(shí)”系列錯(cuò)誤//------------------------------------------------------------------------------------------------LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ); //窗口過程函數(shù)HRESULT Direct3D_Init(HWND hwnd); //在這個(gè)函數(shù)中進(jìn)行Direct3D的初始化HRESULT Objects_Init(HWND hwnd); //在這個(gè)函數(shù)中進(jìn)行要繪制的物體的資源初始化VOID Direct3D_Render(HWND hwnd); //在這個(gè)函數(shù)中進(jìn)行Direct3D渲染代碼的書寫VOID Direct3D_CleanUp( ); //在這個(gè)函數(shù)中清理COM資源以及其他資源float Get_FPS(); //計(jì)算幀數(shù)的函數(shù)VOID Matrix_Set(); //封裝了四大變換的函數(shù)//-----------------------------------【W(wǎng)inMain( )函數(shù)】--------------------------------------// 描述:Windows應(yīng)用程序的入口函數(shù),我們的程序從這里開始//------------------------------------------------------------------------------------------------int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nShowCmd){ //【1】窗口創(chuàng)建四步曲之一:開始設(shè)計(jì)一個(gè)完整的窗口類 WNDCLASSEX wndClass = { 0 }; //用WINDCLASSEX定義了一個(gè)窗口類 wndClass.cbSize = sizeof( WNDCLASSEX ) ; //設(shè)置結(jié)構(gòu)體的字節(jié)數(shù)大小 wndClass.style = CS_HREDRAW | CS_VREDRAW; //設(shè)置窗口的樣式 wndClass.lpfnWndProc = WndProc; //設(shè)置指向窗口過程函數(shù)的指針 wndClass.cbClsExtra = 0; //窗口類的附加內(nèi)存,取0就可以了 wndClass.cbWndExtra = 0; //窗口的附加內(nèi)存,依然取0就行了 wndClass.hInstance = hInstance; //指定包含窗口過程的程序的實(shí)例句柄。 wndClass.hIcon=(HICON)::LoadImage(NULL,L"icon.ico",IMAGE_ICON,0,0,LR_DEFAULTSIZE|LR_LOADFROMFILE); //本地加載自定義ico圖標(biāo) wndClass.hCursor = LoadCursor( NULL, IDC_ARROW ); //指定窗口類的光標(biāo)句柄。 wndClass.hbrBackground=(HBRUSH)GetStockObject(GRAY_BRUSH); //為hbrBackground成員指定一個(gè)白色畫刷句柄 wndClass.lpszMenuName = NULL; //用一個(gè)以空終止的字符串,指定菜單資源的名字。 wndClass.lpszClassName = L"ForTheDreamOfGameDevelop"; //用一個(gè)以空終止的字符串,指定窗口類的名字。 //【2】窗口創(chuàng)建四步曲之二:注冊窗口類 if( !RegisterClassEx( &wndClass ) ) //設(shè)計(jì)完窗口后,需要對窗口類進(jìn)行注冊,這樣才能創(chuàng)建該類型的窗口 return -1; //【3】窗口創(chuàng)建四步曲之三:正式創(chuàng)建窗口 HWND hwnd = CreateWindow( L"ForTheDreamOfGameDevelop",WINDOW_TITLE, //喜聞樂見的創(chuàng)建窗口函數(shù)CreateWindow WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, WINDOW_WIDTH, WINDOW_HEIGHT, NULL, NULL, hInstance, NULL ); //Direct3D資源的初始化,調(diào)用失敗用messagebox予以顯示 if (!(S_OK==Direct3D_Init (hwnd))) { MessageBox(hwnd, _T("Direct3D初始化失敗~!"), _T("淺墨的消息窗口"), 0); //使用MessageBox函數(shù),創(chuàng)建一個(gè)消息窗口 } //【4】窗口創(chuàng)建四步曲之四:窗口的移動(dòng)、顯示與更新 MoveWindow(hwnd,250,80,WINDOW_WIDTH,WINDOW_HEIGHT,true); //調(diào)整窗口顯示時(shí)的位置,使窗口左上角位于(250,80)處 ShowWindow( hwnd, nShowCmd ); //調(diào)用ShowWindow函數(shù)來顯示窗口 UpdateWindow(hwnd); //對窗口進(jìn)行更新,就像我們買了新房子要裝修一樣 PlaySound(L"永遠(yuǎn)の誓い.wav", NULL, SND_FILENAME | SND_ASYNC|SND_LOOP); //循環(huán)播放背景音樂 //【5】消息循環(huán)過程 MSG msg = { 0 }; //初始化msg while( msg.message != WM_QUIT ) //使用while循環(huán) { if( PeekMessage( &msg, 0, 0, 0, PM_REMOVE ) ) //查看應(yīng)用程序消息隊(duì)列,有消息時(shí)將隊(duì)列中的消息派發(fā)出去。 { TranslateMessage( &msg ); //將虛擬鍵消息轉(zhuǎn)換為字符消息 DispatchMessage( &msg ); //該函數(shù)分發(fā)一個(gè)消息給窗口程序。 } else { Direct3D_Render(hwnd); //進(jìn)行渲染 } } //【6】窗口類的注銷 UnregisterClass(L"ForTheDreamOfGameDevelop", wndClass.hInstance); //程序準(zhǔn)備結(jié)束,注銷窗口類 return 0; }//-----------------------------------【W(wǎng)ndProc( )函數(shù)】--------------------------------------// 描述:窗口過程函數(shù)WndProc,對窗口消息進(jìn)行處理//------------------------------------------------------------------------------------------------LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ) { switch( message ) //switch語句開始 { case WM_PAINT: // 若是客戶區(qū)重繪消息 Direct3D_Render(hwnd); // 調(diào)用Direct3D渲染函數(shù) ValidateRect(hwnd, NULL); // 更新客戶區(qū)的顯示 break; // 跳出該switch語句 case WM_KEYDOWN: // 若是鍵盤按下消息 if (wParam == VK_ESCAPE) // 如果被按下的鍵是ESC DestroyWindow(hwnd); // 銷毀窗口, 并發(fā)送一條WM_DESTROY消息 break; // 跳出該switch語句 case WM_DESTROY: //若是窗口銷毀消息 Direct3D_CleanUp(); //調(diào)用自定義的資源清理函數(shù)Game_CleanUp()進(jìn)行退出前的資源清理 PostQuitMessage( 0 ); //向系統(tǒng)表明有個(gè)線程有終止請求。用來響應(yīng)WM_DESTROY消息 break; //跳出該switch語句 default: //若上述case條件都不符合,則執(zhí)行該default語句 return DefWindowProc( hwnd, message, wParam, lParam ); //調(diào)用缺省的窗口過程 } return 0; //正常退出}//-----------------------------------【Direct3D_Init( )函數(shù)】--------------------------------------// 描述:Direct3D初始化函數(shù),進(jìn)行Direct3D的初始化//------------------------------------------------------------------------------------------------HRESULT Direct3D_Init(HWND hwnd){ //-------------------------------------------------------------------------------------- // 【Direct3D初始化四步曲之一,創(chuàng)接口】:創(chuàng)建Direct3D接口對象, 以便用該Direct3D對象創(chuàng)建Direct3D設(shè)備對象 //-------------------------------------------------------------------------------------- LPDIRECT3D9 pD3D = NULL; //Direct3D接口對象的創(chuàng)建 if( NULL == ( pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) ) //初始化Direct3D接口對象,并進(jìn)行DirectX版本協(xié)商 return E_FAIL; //-------------------------------------------------------------------------------------- // 【Direct3D初始化四步曲之二,取信息】:獲取硬件設(shè)備信息 //-------------------------------------------------------------------------------------- D3DCAPS9 caps; int vp = 0; //D3DADAPTER_DEFAULT: 使用的顯卡序號(hào)默認(rèn)值 //D3DDEVTYPE_HAL: 設(shè)備類型為硬件 //caps: 接收設(shè)備信息 if( FAILED( pD3D->GetDeviceCaps( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &caps ) ) ) { return E_FAIL; } //D3DDEVCAPS_HWTRANSFORMANDLIGHT:表示顯卡可以硬件支持變換和光照 if( caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT ) vp = D3DCREATE_HARDWARE_VERTEXPROCESSING; //支持硬件頂點(diǎn)運(yùn)算,我們就采用硬件頂點(diǎn)運(yùn)算,妥妥的 else vp = D3DCREATE_SOFTWARE_VERTEXPROCESSING; //不支持硬件頂點(diǎn)運(yùn)算,無奈只好采用軟件頂點(diǎn)運(yùn)算 //-------------------------------------------------------------------------------------- // 【Direct3D初始化四步曲之三,填內(nèi)容】:填充D3DPRESENT_PARAMETERS結(jié)構(gòu)體 //-------------------------------------------------------------------------------------- D3DPRESENT_PARAMETERS d3dpp; ZeroMemory(&d3dpp, sizeof(d3dpp)); d3dpp.BackBufferWidth = WINDOW_WIDTH; //后臺(tái)緩沖區(qū)寬度 d3dpp.BackBufferHeight = WINDOW_HEIGHT; //后臺(tái)緩沖區(qū)高度 d3dpp.BackBufferFormat = D3DFMT_A8R8G8B8; //后臺(tái)緩沖區(qū)保存像素格式 d3dpp.BackBufferCount = 1; //后臺(tái)緩沖區(qū)數(shù)量 d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE; //多重采樣類型 d3dpp.MultiSampleQuality = 0; //多重采樣格式 d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; //如何將后臺(tái)緩沖區(qū)的內(nèi)容復(fù)制到前臺(tái)的緩存中 d3dpp.hDeviceWindow = hwnd; //在哪個(gè)窗口上進(jìn)行繪制 d3dpp.Windowed = true; //繪制窗口的顯示模式,true表示窗口模式,false表示全屏顯示 d3dpp.EnableAutoDepthStencil = true; //表示Direct3D是否為應(yīng)用程序自動(dòng)管理深度緩存 d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8; //指定深度緩存像素格式 d3dpp.Flags = 0; //附加屬性 d3dpp.FullScreen_RefreshRateInHz = 0; //表示全屏模式時(shí)指定的屏幕的刷新率 d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE; //指定后臺(tái)緩沖區(qū)與前臺(tái)緩沖區(qū)的最大交換率 //-------------------------------------------------------------------------------------- // 【Direct3D初始化四步曲之四,創(chuàng)設(shè)備】:創(chuàng)建Direct3D設(shè)備接口 //-------------------------------------------------------------------------------------- //D3DADAPTER_DEFAULT: 使用默認(rèn)的顯卡 //D3DDEVTYPE_HAL: 硬件設(shè)備類型 //hwnd: 指定當(dāng)Direct3D程序從前臺(tái)變換到后臺(tái)時(shí)的提示窗口,當(dāng)窗口模式運(yùn)行時(shí),可以為NULL, //為達(dá)到正確的顯示效果,設(shè)為和Direct3D第三步中的窗口句柄成員一致 //vp: 設(shè)備行為標(biāo)識(shí),Direct3D第二步中得到,硬件或軟件類型 //d3dpp: Direct3D第三步中已經(jīng)初始化過的D3DPRESENT_PARAMETERS類型結(jié)果體 //g_pd3dDevice: 得到Direct3D設(shè)備接口指針,CreateDevice便是為了得到該接口指針 if(FAILED(pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd, vp, &d3dpp, &g_pd3dDevice))) return E_FAIL; SAFE_RELEASE(pD3D) //LPDIRECT3D9接口對象的使命完成,我們將其釋放掉 if(!(S_OK==Objects_Init(hwnd))) return E_FAIL; //調(diào)用一次Objects_Init,進(jìn)行渲染資源的初始化 // 設(shè)置渲染狀態(tài) g_pd3dDevice->SetRenderState(D3DRS_LIGHTING, FALSE); //關(guān)閉光照 g_pd3dDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW); //開啟背面消隱 return S_OK;}//-----------------------------------【Object_Init( )函數(shù)】--------------------------------------// 描述:渲染資源初始化函數(shù),在此函數(shù)中進(jìn)行要被渲染的物體的資源的初始化//--------------------------------------------------------------------------------------------------HRESULT Objects_Init(HWND hwnd){ //創(chuàng)建字體 //g_pd3dDevice: Direct3D設(shè)備指針 //36: 字體高度 //0: 字體寬度 //0: 字體權(quán)重值 //1:字體的過濾屬性 //false: 是否為斜體 //DEFAULT_CHARSET: 字體所用的字符集 //OUT_DEFAULT_PRECIS: 輸出文本的精度 //DEFAULT_QUALITY: 指定字體的輸出質(zhì)量 //0:指定字體的索引號(hào),通常為0 //_T("微軟雅黑"): 要?jiǎng)?chuàng)建字體的名稱 //g_pFont: 指針,存儲(chǔ)字體 if(FAILED(D3DXCreateFont(g_pd3dDevice, 36, 0, 0, 1, false, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, DEFAULT_QUALITY, 0, _T("微軟雅黑"), &g_pFont))) return E_FAIL; srand(timeGetTime()); //用系統(tǒng)時(shí)間初始化隨機(jī)種子 //-------------------------------------------------------------------------------------- // 【頂點(diǎn)緩存、索引緩存繪圖四步曲之二】:創(chuàng)建頂點(diǎn)緩存和索引緩存 //-------------------------------------------------------------------------------------- //創(chuàng)建頂點(diǎn)緩存 //8*sizeof(CUSTOMVERTEX): 緩存大小,以字節(jié)為單位,一個(gè)立方體有8個(gè)頂點(diǎn) //0: 用于指定緩存的一些附加屬性,0表示沒有附加屬性 //D3DFVF_CUSTOMVERTEX: 指定將要存儲(chǔ)在頂點(diǎn)緩存中的靈活頂點(diǎn)格式,第一步中已指定 //D3DPOOL_DEFAULT: 指定存儲(chǔ)頂點(diǎn)緩存的內(nèi)存位置是在內(nèi)存中還是在顯卡的顯存中,這里是后者 //g_pVertexBuffer:得到創(chuàng)建好的頂點(diǎn)緩存的地址 //NULL: 保留參數(shù),一般為NULL if( FAILED( g_pd3dDevice->CreateVertexBuffer( 8*sizeof(CUSTOMVERTEX), 0, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &g_pVertexBuffer, NULL ) ) ) { return E_FAIL; } //創(chuàng)建索引緩存 //索引緩存保存了構(gòu)成物體的頂點(diǎn)在頂點(diǎn)緩存中的索引值 //36* sizeof(WORD):索引緩存大小,以字節(jié)為單位,一個(gè)立方體有6個(gè)面,每個(gè)面2個(gè)三角形,每個(gè)三角形3個(gè)頂點(diǎn) //0: 用于指定緩存的一些附加屬性,0表示沒有附加屬性 //D3DFMT_INDEX16: 指定索引緩存中存儲(chǔ)每個(gè)索引的大小,這里為16位索引 //D3DPOOL_DEFAULT: 指定存儲(chǔ)頂點(diǎn)緩存的內(nèi)存位置是在內(nèi)存中還是在顯卡的顯存中,這里是后者 //g_pIndexBuffer: 得到創(chuàng)建好的索引緩存的地址 //NULL: 保留參數(shù),一般為NUL if( FAILED( g_pd3dDevice->CreateIndexBuffer(36* sizeof(WORD), 0, D3DFMT_INDEX16, D3DPOOL_DEFAULT, &g_pIndexBuffer, NULL)) ) { return E_FAIL; } //-------------------------------------------------------------------------------------- // 【頂點(diǎn)緩存、索引緩存繪圖四步曲之三】:訪問頂點(diǎn)緩存和索引緩存 //-------------------------------------------------------------------------------------- //頂點(diǎn)數(shù)據(jù)的設(shè)置, CUSTOMVERTEX Vertices[] = { { -20.0f, 20.0f, -20.0f, D3DCOLOR_XRGB(rand() % 256, rand() % 256, rand() % 256) }, { -20.0f, 20.0f, 20.0f, D3DCOLOR_XRGB(rand() % 256, rand() % 256, rand() % 256) }, { 20.0f, 20.0f, 20.0f, D3DCOLOR_XRGB(rand() % 256, rand() % 256, rand() % 256) }, { 20.0f, 20.0f, -20.0f, D3DCOLOR_XRGB(rand() % 256, rand() % 256, rand() % 256) }, { -20.0f, -20.0f, -20.0f, D3DCOLOR_XRGB(rand() % 256, rand() % 256, rand() % 256) }, { -20.0f, -20.0f, 20.0f, D3DCOLOR_XRGB(rand() % 256, rand() % 256, rand() % 256) }, { 20.0f, -20.0f, 20.0f, D3DCOLOR_XRGB(rand() % 256, rand() % 256, rand() % 256) }, { 20.0f, -20.0f, -20.0f, D3DCOLOR_XRGB(rand() % 256, rand() % 256, rand() % 256) }, }; //填充頂點(diǎn)緩存 VOID* pVertices; //對緩存加鎖,取得加鎖后的緩存首地址,然后通過該地址向頂點(diǎn)緩存中寫入頂點(diǎn)信息 //0: 加鎖區(qū)域自存儲(chǔ)空間的起始位置到開始鎖定位置的偏移量,單位為字節(jié) //sizeof(Vertices): 要鎖定的字節(jié)數(shù),也就是加鎖區(qū)域的大小 //pVertices: 指向被鎖定的存儲(chǔ)區(qū)的起始地址的指針 //0: 表示鎖定的方式 if( FAILED( g_pVertexBuffer->Lock( 0, sizeof(Vertices), (void**)&pVertices, 0 ) ) ) return E_FAIL; memcpy( pVertices, Vertices, sizeof(Vertices) ); //填充頂點(diǎn)緩存 g_pVertexBuffer->Unlock(); // 填充索引數(shù)據(jù) WORD *pIndices = NULL; //對緩存加鎖,取得加鎖后的緩存首地址,然后通過該地址向索引緩存中寫入索引信息 //0: 加鎖區(qū)域自存儲(chǔ)空間的起始位置到開始鎖定位置的偏移量,單位為字節(jié) //0: 要鎖定的字節(jié)數(shù),也就是加鎖區(qū)域的大小 //pIndices: 指向被鎖定的存儲(chǔ)區(qū)的起始地址的指針 //0: 表示鎖定的方式 g_pIndexBuffer->Lock(0, 0, (void**)&pIndices, 0); // 頂面 pIndices[0] = 0, pIndices[1] = 1, pIndices[2] = 2; pIndices[3] = 0, pIndices[4] = 2, pIndices[5] = 3; // 正面 pIndices[6] = 0, pIndices[7] = 3, pIndices[8] = 7; pIndices[9] = 0, pIndices[10] = 7, pIndices[11] = 4; // 左側(cè)面 pIndices[12] = 0, pIndices[13] = 4, pIndices[14] = 5; pIndices[15] = 0, pIndices[16] = 5, pIndices[17] = 1; // 右側(cè)面 pIndices[18] = 2, pIndices[19] = 6, pIndices[20] = 7; pIndices[21] = 2, pIndices[22] = 7, pIndices[23] = 3; // 背面 pIndices[24] = 2, pIndices[25] = 5, pIndices[26] = 6; pIndices[27] = 2, pIndices[28] = 1, pIndices[29] = 5; // 底面 pIndices[30] = 4, pIndices[31] = 6, pIndices[32] = 5; pIndices[33] = 4, pIndices[34] = 7, pIndices[35] = 6; g_pIndexBuffer->Unlock(); return S_OK;}//-----------------------------------【Matrix_Set( )函數(shù)】--------------------------------------// 描述:封裝了Direct3D四大變換的函數(shù),即世界變換,取景變換,投影變換,視口變換的設(shè)置//--------------------------------------------------------------------------------------------------VOID Matrix_Set(){ //-------------------------------------------------------------------------------------- //【四大變換之一】:世界變換矩陣的設(shè)置 //-------------------------------------------------------------------------------------- D3DXMATRIX matWorld, Rx, Ry, Rz; D3DXMatrixIdentity(&matWorld); // 單位化世界矩陣 //Rx: 作為輸出的旋轉(zhuǎn)矩陣 //D3DX_PI *(::timeGetTime() / 1000.0f):要旋轉(zhuǎn)的弧度值,1度=π/180 弧度 //如果旋轉(zhuǎn)90度,應(yīng)為90 * D3DX_PI / 180,D3DX_PI = π D3DXMatrixRotationX(&Rx, D3DX_PI *(::timeGetTime() / 1000.0f)); // 繞X軸旋轉(zhuǎn) D3DXMatrixRotationY(&Ry, D3DX_PI *( ::timeGetTime() / 1000.0f/2)); // 繞Y軸旋轉(zhuǎn) D3DXMatrixRotationZ(&Rz, D3DX_PI *( ::timeGetTime() / 1000.0f/3)); // 繞Z軸旋轉(zhuǎn) matWorld = Rx * Ry * Rz * matWorld; // 得到最終的組合矩陣 //D3DTS_WORLD: 表示變換的類型,這里是世界矩陣 g_pd3dDevice->SetTransform(D3DTS_WORLD, &matWorld); //設(shè)置世界變換矩陣 //-------------------------------------------------------------------------------------- //【四大變換之二】:取景變換矩陣的設(shè)置 //-------------------------------------------------------------------------------------- D3DXMATRIX matView; //定義一個(gè)矩陣,最終生成的觀察矩陣 D3DXVECTOR3 vEye(0.0f, 0.0f, -200.0f); //攝像機(jī)在世界坐標(biāo)系中的位置 D3DXVECTOR3 vAt(0.0f, 0.0f, 0.0f); //觀察點(diǎn)在世界坐標(biāo)系中的位置 D3DXVECTOR3 vUp(0.0f, 1.0f, 0.0f); //攝像機(jī)向上的向量,通常為(0,1,0) D3DXMatrixLookAtLH(&matView, &vEye, &vAt, &vUp); //計(jì)算出取景變換矩陣 //D3DTS_VIEW: 取景變換 g_pd3dDevice->SetTransform(D3DTS_VIEW, &matView); //應(yīng)用取景變換矩陣 //-------------------------------------------------------------------------------------- //【四大變換之三】:投影變換矩陣的設(shè)置 //-------------------------------------------------------------------------------------- D3DXMATRIX matProj; //定義一個(gè)矩陣 //matProj: 最終生成的投影變換矩陣 //D3DX_PI / 4.0f: 以弧度為單位的攝像機(jī)在y軸上的成像角度,即視域角度,角度越小,投影圖形越大 //1.0f: 描述屏幕顯示區(qū)域的縱橫比,屏幕的寬度/高度 //1.0f: 視截體中近裁剪面距攝像機(jī)的位置 //1000.0f:視截體中遠(yuǎn)裁剪面距攝像機(jī)的位置 D3DXMatrixPerspectiveFovLH(&matProj, D3DX_PI / 4.0f, 1.0f, 1.0f, 1000.0f); //計(jì)算投影變換矩陣 //D3DTS_PROJECTION:投影變換 g_pd3dDevice->SetTransform(D3DTS_PROJECTION, &matProj); //設(shè)置投影變換矩陣 //-------------------------------------------------------------------------------------- //【四大變換之四】:視口變換的設(shè)置 //-------------------------------------------------------------------------------------- //用于將投影窗口中的圖形轉(zhuǎn)換到顯示屏幕的程序窗口中,視口可以是整個(gè)程窗口,也可以是窗口中的其他矩形區(qū)域 D3DVIEWPORT9 vp; //實(shí)例化一個(gè)D3DVIEWPORT9結(jié)構(gòu)體,然后做填空題給各個(gè)參數(shù)賦值就可以了 vp.X = 0; //表示視口相對于窗口的X坐標(biāo) vp.Y = 0; //視口相對對窗口的Y坐標(biāo) vp.Width = WINDOW_WIDTH; //視口的寬度 vp.Height = WINDOW_HEIGHT; //視口的高度 vp.MinZ = 0.0f; //視口在深度緩存中的最小深度值 vp.MaxZ = 1.0f; //視口在深度緩存中的最大深度值 g_pd3dDevice->SetViewport(&vp); //視口的設(shè)置}//-----------------------------------【Direct3D_Render( )函數(shù)】-------------------------------// 描述:使用Direct3D進(jìn)行渲染//--------------------------------------------------------------------------------------------------void Direct3D_Render(HWND hwnd){ //-------------------------------------------------------------------------------------- // 【Direct3D渲染五步曲之一】:清屏操作 //-------------------------------------------------------------------------------------- //0: 下一個(gè)參數(shù)指向的矩形數(shù)組中矩形的數(shù)量,如果下一個(gè)參數(shù)為NULL,此參數(shù)必須為0 //NULL: 表示要清空的目標(biāo)矩形區(qū)域 //D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER: 指定需要清空的緩沖區(qū),顏色緩沖區(qū)|深度緩沖區(qū) //D3DCOLOR_XRGB(255, 214, 158): 在清空顏色緩沖區(qū)后每個(gè)像素對應(yīng)的顏色值 //1.0f: 清空深度緩沖區(qū)后每個(gè)像素對應(yīng)的深度值 //0: 清空模板緩沖區(qū)后每個(gè)像素對應(yīng)的模板值 g_pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(255, 214, 158), 1.0f, 0); //定義一個(gè)矩形,用于獲取主窗口矩形 RECT formatRect; GetClientRect(hwnd, &formatRect); //-------------------------------------------------------------------------------------- // 【Direct3D渲染五步曲之二】:開始繪制 //-------------------------------------------------------------------------------------- g_pd3dDevice->BeginScene(); // 開始繪制 //-------------------------------------------------------------------------------------- // 【Direct3D渲染五步曲之三】:正式繪制,利用頂點(diǎn)緩存繪制圖形 //-------------------------------------------------------------------------------------- //---------------------------------------------------------------- // 【頂點(diǎn)緩存、索引緩存繪圖四步曲之四】:繪制圖形 //---------------------------------------------------------------- Matrix_Set();//調(diào)用封裝了四大變換的函數(shù),對Direct3D世界變換,取景變換,投影變換,視口變換進(jìn)行設(shè)置 // 獲取鍵盤消息并給予設(shè)置相應(yīng)的多邊形填充模式 if (::GetAsyncKeyState(0x31) & 0x8000f) // 若數(shù)字鍵1被按下,進(jìn)行線框填充 g_pd3dDevice->SetRenderState(D3DRS_FILLMODE, D3DFILL_WIREFRAME); if (::GetAsyncKeyState(0x32) & 0x8000f) // 若數(shù)字鍵2被按下,進(jìn)行實(shí)體填充 g_pd3dDevice->SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID); //0: 用于指定與該頂點(diǎn)緩存建立連接的的數(shù)據(jù)流,通常為0,因?yàn)椴簧婕岸鄠€(gè)流 //g_pVertexBuffer:包含頂點(diǎn)數(shù)據(jù)的頂點(diǎn)緩存的指針 //0: 表示在數(shù)據(jù)流中以字節(jié)為單位的的偏移量,一般為0 //sizeof(CUSTOMVERTEX):在頂點(diǎn)緩存中存儲(chǔ)每個(gè)頂點(diǎn)結(jié)構(gòu)的大小,單位為字節(jié) g_pd3dDevice->SetStreamSource(0, g_pVertexBuffer, 0, sizeof(CUSTOMVERTEX)); //把包含的幾何體信息的頂點(diǎn)緩存和渲染流水線相關(guān)聯(lián) //D3DFVF_CUSTOMVERTEX:表示設(shè)置為當(dāng)前需要使用的靈活頂點(diǎn)格式,第一步定義過的 g_pd3dDevice->SetFVF(D3DFVF_CUSTOMVERTEX); //指定我們使用的靈活頂點(diǎn)格式的宏名稱 g_pd3dDevice->SetIndices(g_pIndexBuffer); //設(shè)置索引緩存 //D3DPT_TRIANGLELIST: 要繪制的圖元類型,為三角形列 //0: 從哪個(gè)頂點(diǎn)開始作索引目錄 //0: 索引數(shù)組中最小的索引值,通常為0 //8: 為多少個(gè)頂點(diǎn)作索引,一個(gè)立方體有8個(gè)頂點(diǎn)---重要 //0: 從索引中的第幾個(gè)索引處開始繪制圖元----重要 //12:繪制圖元的個(gè)數(shù),一個(gè)正方體有6個(gè)面,每個(gè)面由2個(gè)三角形 g_pd3dDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, 8, 0, 12); //利用索引緩存配合頂點(diǎn)緩存繪制圖形 //在窗口右上角處,顯示每秒幀數(shù) int charCount = swprintf_s(g_strFPS, 20, _T("FPS:%0.3f"), Get_FPS() ); //NULL: 指定字符串所屬的ID3DXSprite對象接口,NULL表示在當(dāng)前窗口繪制字符串 //g_strFPS:指定將要繪制的字符串內(nèi)容 //charCount:指定繪制字符的個(gè)數(shù) //formatRect: 用于繪制字符串的矩形區(qū)域位置 //DT_TOP | DT_RIGHT:矩形區(qū)域擺放屬性,字符串位于矩形區(qū)域頂部|字符串右對齊 //D3DCOLOR_XRGB(255,39,136): 顏色 g_pFont->DrawText(NULL, g_strFPS, charCount , &formatRect, DT_TOP | DT_RIGHT, D3DCOLOR_XRGB(255,39,136)); //-------------------------------------------------------------------------------------- // 【Direct3D渲染五步曲之四】:結(jié)束繪制 //-------------------------------------------------------------------------------------- g_pd3dDevice->EndScene(); // 結(jié)束繪制 //-------------------------------------------------------------------------------------- // 【Direct3D渲染五步曲之五】:顯示翻轉(zhuǎn) //-------------------------------------------------------------------------------------- g_pd3dDevice->Present(NULL, NULL, NULL, NULL); // 翻轉(zhuǎn)與顯示}//-----------------------------------【Get_FPS( )函數(shù)】------------------------------------------// 描述:用于計(jì)算每秒幀速率的一個(gè)函數(shù)//--------------------------------------------------------------------------------------------------float Get_FPS(){ //定義四個(gè)靜態(tài)變量 static float fps = 0; //我們需要計(jì)算的FPS值 static int frameCount = 0; //幀數(shù) static float currentTime =0.0f; //當(dāng)前時(shí)間 static float lastTime = 0.0f; //持續(xù)時(shí)間 frameCount++; //每調(diào)用一次Get_FPS()函數(shù),幀數(shù)自增1 currentTime = timeGetTime()*0.001f; //獲取系統(tǒng)時(shí)間,其中timeGetTime函數(shù)返回的是以毫秒為單位的系統(tǒng)時(shí)間,所以需要乘以0.001,得到單位為秒的時(shí)間 //如果當(dāng)前時(shí)間減去持續(xù)時(shí)間大于了1秒鐘,就進(jìn)行一次FPS的計(jì)算和持續(xù)時(shí)間的更新,并將幀數(shù)值清零 if(currentTime - lastTime > 1.0f) //將時(shí)間控制在1秒鐘 { fps = (float)frameCount /(currentTime - lastTime);//計(jì)算這1秒鐘的FPS值 lastTime = currentTime; //將當(dāng)前時(shí)間currentTime賦給持續(xù)時(shí)間lastTime,作為下一秒的基準(zhǔn)時(shí)間 frameCount = 0; //將本次幀數(shù)frameCount值清零 } return fps;}//-----------------------------------【Direct3D_CleanUp( )函數(shù)】--------------------------------// 描述:資源清理函數(shù),在此函數(shù)中進(jìn)行程序退出前資源的清理工作//---------------------------------------------------------------------------------------------------void Direct3D_CleanUp(){ //釋放COM接口對象 SAFE_RELEASE(g_pIndexBuffer) SAFE_RELEASE(g_pVertexBuffer) SAFE_RELEASE(g_pFont) SAFE_RELEASE(g_pd3dDevice)}

這里寫圖片描述


發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 灵石县| 肃宁县| 江门市| 湘乡市| 紫阳县| 宜兰县| 汨罗市| 本溪市| 邵阳县| 滁州市| 九寨沟县| 肥乡县| 固阳县| 阳谷县| 巫山县| 津市市| 彰化市| 扬州市| 三河市| 台州市| 丹凤县| 额尔古纳市| 德清县| 拜城县| 容城县| 瑞金市| 安多县| 冀州市| 忻州市| 肃北| 昌黎县| 昆山市| 呼伦贝尔市| 海伦市| 武乡县| 宿松县| 宝兴县| 晋中市| 竹北市| 格尔木市| 丽水市|