亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

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

Direct3D的四大變換

2019-11-11 03:38:28
字體:
來源:轉載
供稿:網友
//-----------------------------------【程序說明】----------------------------------------------// 程序名稱::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)}

這里寫圖片描述


上一篇:運行時庫

下一篇:poj1005

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91免费人成网站在线观看18| 91免费电影网站| 久久久久久com| 久久躁狠狠躁夜夜爽| 亚洲天堂av在线免费观看| 日韩一级裸体免费视频| 欧美日韩第一视频| 亚洲综合在线做性| 91国产视频在线播放| 欧美裸体男粗大视频在线观看| 久久久亚洲精品视频| 日本人成精品视频在线| 国产精品激情自拍| 成人做爰www免费看视频网站| 亚洲欧美在线播放| 亚洲成人精品久久| 久久久国产在线视频| 亚洲一区二区三区在线免费观看| 亚洲天堂av在线免费观看| 国产视频一区在线| 91成人在线播放| 国产不卡精品视男人的天堂| 亚洲另类图片色| 国产91精品久久久久| 中文字幕视频在线免费欧美日韩综合在线看| 欧洲成人性视频| 亚洲欧美日韩视频一区| 精品久久久久久中文字幕大豆网| 亚洲精品资源美女情侣酒店| 亚洲成av人片在线观看香蕉| 久久青草精品视频免费观看| 国产精品人人做人人爽| 亚洲女人初尝黑人巨大| 欧美日韩另类字幕中文| 亚洲欧美日韩精品久久亚洲区| 亚洲精品自拍第一页| 亚洲日本欧美中文幕| 欧美日韩国产一区二区三区| 中文字幕亚洲无线码a| 欧美香蕉大胸在线视频观看| 亚洲欧美日韩精品久久亚洲区| 国产色婷婷国产综合在线理论片a| 久久精品国产99国产精品澳门| 久久久精品久久久| 精品无人国产偷自产在线| 久久精品久久精品亚洲人| 岛国av一区二区| 亚洲欧美另类人妖| 亚洲毛片在线看| 国产精品女人网站| 亚洲成人久久电影| 亚洲加勒比久久88色综合| 国产精品啪视频| 最近2019中文字幕在线高清| 亚洲国产天堂久久综合网| 国产精品高潮呻吟久久av黑人| 国产成人avxxxxx在线看| 欧美超级免费视 在线| 国产日韩亚洲欧美| 亚洲欧洲日本专区| 久久不射热爱视频精品| 国产综合视频在线观看| 日韩av免费在线| 欧美日韩亚洲一区二区三区| 欧美在线观看网址综合| 国产国语videosex另类| 57pao成人国产永久免费| 成人在线一区二区| 欧美成人午夜激情在线| 亚洲a∨日韩av高清在线观看| 国产成人高清激情视频在线观看| 日本欧美黄网站| 久久久久这里只有精品| 午夜精品在线观看| 欧美在线免费视频| 国模吧一区二区| 亚洲欧美日韩另类| 97人洗澡人人免费公开视频碰碰碰| 日本伊人精品一区二区三区介绍| 韩国美女主播一区| 国产精品久久婷婷六月丁香| 久久久av免费| 日韩精品极品视频| 午夜免费在线观看精品视频| 欧美xxxx14xxxxx性爽| 最近2019中文免费高清视频观看www99| 日韩精品免费一线在线观看| 日韩在线免费高清视频| 欧美日在线观看| 久久免费视频观看| 亚洲精品小视频在线观看| 伊人久久男人天堂| 久久大大胆人体| 精品国偷自产在线| 91中文在线视频| 久久精品99久久香蕉国产色戒| 久久久久久久久网站| 国产精品日日摸夜夜添夜夜av| 91在线精品视频| 自拍偷拍亚洲在线| 2021国产精品视频| 国内成人精品一区| 亚洲系列中文字幕| 日韩精品在线私人| 久久久www成人免费精品| 国产精品免费一区豆花| 欧美裸体xxxx极品少妇软件| 欧美日韩亚洲高清| 亚洲精品在线视频| 97在线看免费观看视频在线观看| 26uuu另类亚洲欧美日本一| 国产性色av一区二区| 日韩精品极品视频免费观看| 91精品啪在线观看麻豆免费| 精品女同一区二区三区在线播放| 91精品国产综合久久香蕉| 一道本无吗dⅴd在线播放一区| 国产精品美女www爽爽爽视频| 久久人人爽国产| 亚洲网站在线看| 日韩av一区二区在线观看| 国产精品丝袜视频| 一区二区欧美在线| 久久九九国产精品怡红院| 九九精品在线播放| 欧美极品少妇与黑人| 欧美电影免费观看大全| 欧美日韩国产专区| 亚洲国产精品嫩草影院久久| 97精品国产97久久久久久| 中文字幕av一区| 国产欧美日韩综合精品| 国内精品久久久久久| 欧美午夜片在线免费观看| 欧美午夜精品久久久久久人妖| 久久久精品一区二区三区| 欧美精品久久久久久久久久| 久久精品久久久久电影| 在线成人一区二区| 国产精品一区二区三区毛片淫片| 揄拍成人国产精品视频| 欧美国产日本高清在线| 尤物yw午夜国产精品视频| 中文字幕亚洲欧美日韩在线不卡| 91精品国产乱码久久久久久久久| 亚洲综合中文字幕68页| 日本中文字幕久久看| 成人激情黄色网| 海角国产乱辈乱精品视频| 亚洲国产另类久久精品| 国产成人精品久久二区二区91| 亚洲无线码在线一区观看| 欧美性开放视频| 成人免费网站在线| 91禁国产网站| 夜夜狂射影院欧美极品| 久久亚洲精品一区| 亚洲综合中文字幕在线| 久久伊人精品天天| 亚洲国产欧美一区二区三区久久| 日韩男女性生活视频| 疯狂欧美牲乱大交777| 亚洲第一区第二区| 欧美性生交xxxxxdddd|