麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學院 > 開發設計 > 正文

Direct3D的四大變換

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

這里寫圖片描述


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 免费亚洲视频在线观看 | 精品免费国产一区二区三区 | 精品国产91久久久久久久妲己 | 亚洲第一视频 | 黑人操穴| 日本黄色免费观看视频 | 欧美性受xxxx白人性爽 | 婷婷久久青草热一区二区 | 欧美视频99 | 成人性生活视频 | 午夜久久视频 | 毛片在线免费视频 | 欧美一级网 | 精品亚洲va在线va天堂资源站 | 精品国产96亚洲一区二区三区 | 免费一区区三区四区 | 国产精品美女一区二区 | 亚洲一区二区在线 | 欧美日韩电影在线 | 成年毛片| 三级国产三级在线 | 成人av一二三区 | 国产精品久久久久av | 久久免费精品 | 亚洲午夜久久久精品一区二区三区 | 免费看日韩av | 日本欧美一区二区三区视频麻豆 | 色骚综合 | 特色一级黄色片 | 日本黄色免费观看视频 | 中国杭州少妇xxxx做受 | 成人免费av在线播放 | 一级在线观看视频 | xxxxxx打针视频vk | 在线中文字幕不卡 | 国产一级毛片高清视频完整版 | 369看片你懂的小视频在线观看 | 91精品一区二区综合在线 | 久久综合给合久久狠狠狠97色69 | 91精品国产福利尤物免费 | 亚洲成人国产 |