青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

李錦俊(mybios)的blog

游戲開發 C++ Cocos2d-x OpenGL DirectX 數學 計算機圖形學 SQL Server

  C++博客 :: 首頁 :: 聯系 :: 聚合  :: 管理
  86 Posts :: 0 Stories :: 370 Comments :: 0 Trackbacks

公告

QQ:30743734
EMain:mybios@qq.com

常用鏈接

留言簿(16)

我參與的團隊

最新隨筆

搜索

  •  

積分與排名

  • 積分 - 373511
  • 排名 - 67

最新評論

閱讀排行榜

評論排行榜

引用
DirectX SDK 2006學習筆記1——框架
友情提醒:所謂的框架是指SDK目錄下\Samples\C++\Common路徑下的DXUT系列函數包裝。學習框架的前提是必須有足夠的Windows API,GUI編程經驗,必須熟悉Windows的消息機制,回調機制,最好有萬行左右的C/C++編程經驗。MFC在這里沒有任何用處。另外我覺得最好在看程序之前對于D3D的所有概念有點了解,什么是vertex,texture,matrix,lighting,mesh等等,以及相關的數學概念。這些都可以在網上找到中文翻譯,幫助你快速入門。
?
  DXSDK2006和2003版的比起來更新了不少東西,比如DirectX10,還有Managed
DirectX等等。不過我關心的還是D3D9。除了個別接口的更改之外,DXSDK2006還提供了一套圖形控件的類庫,它的界面還是很漂亮的:)如圖:
?
  學習一個框架還是從它的入口學習比較方便,否則容易迷失在無窮無盡的API和層層包裝之中。DXSDK2006的框架和2003版的DX9.0c框架有很大的不同。首先是2003版的框架中提供了一個CD3DApplication類,這個類對于初始化,清除,以及游戲窗口的創建,游戲主循環進行了包裝。這是一個不錯的類,不知道為什么在2006版中去掉了。不過不要緊,2006版的框架中提供的一些C包裝函數已經足夠了。在看這些函數之前,我們還是先來看看SDK目錄下\Samples\C++ \Direct3D\Tutorials中有些什么吧。Tut01_CreateDevice是創建框架,這個程序不用框架,研究一下有助于了解D3D的大致工作流程。下面是winmain函數中的一部分。
?
??? // Initialize Direct3D
??? if( SUCCEEDED( InitD3D( hWnd ) ) )
??? {
?? ?????// Show the window
??????? ShowWindow( hWnd, SW_SHOWDEFAULT );
??????? UpdateWindow( hWnd );
?
??????? // Enter the message loop
??????? MSGmsg;
??????? while( GetMessage( &msg, NULL, 0, 0 ) )
??????? {
??????????? TranslateMessage( &msg );
???????? ???DispatchMessage( &msg );
??????? }
??? }
  
  在消息循環之前有個初始化設備的函數InitD3D( hWnd ),其代碼如下:
HRESULTInitD3D( HWNDhWnd )
{
??? if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )
??????? returnE_FAIL;
?
??? D3DPRESENT_PARAMETERSd3dpp;
??? ZeroMemory( &d3dpp, sizeof(d3dpp) );
??? d3dpp.Windowed = TRUE;
??? d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
??? d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;
?
if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT,
D3DDEVTYPE_HAL,hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp,
&g_pd3dDevice ) ) )
??? {
??? ????returnE_FAIL;
??? }
??? returnS_OK;
}
?
主要是調用Direct3DCreate9g_pD3D->CreateDevice這兩個函數。查看DXSDK文檔中關于D3DPRESENT_PARAMETERS的定義,大致了解一下。
接下來要關心的就是消息循環了,在回調函數MsgProc中處理了兩個消息,一個是WM_DESTROY,里面調用了Cleanup函數,另一個是WM_PAINT函數,里面調用了Render函數。Cleanup函數很簡單,就是調用D3D對象及其設備對象的Release函數釋放資源,而Render函數就是D3D中最重要的函數了。
VOIDRender()
{
??? if( NULL==g_pd3dDevice)
??????? return;
?
??? // Clear the backbuffer to a blue color
??? g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,255), 1.0f, 0 );
???
??? // Begin the scene
??? if( SUCCEEDED( g_pd3dDevice->BeginScene() ) )
??? {
??????? // Rendering of scene objects can happen here
???
??????? // End the scene
??????? g_pd3dDevice->EndScene();
??? }
?
??? // Present the backbuffer contents to the display
??? g_pd3dDevice->Present( NULL, NULL, NULL, NULL);
}
  主要調用的函數有BeginScene, EndScene和Present函數。
??? 對D3D應用程序有了大概了解之后就可以看空框架程序了。這個程序可以在Samples\C++\Direct3D\EmptyProject中找到。
  從WinMain中的調用可以看到,框架首先設定一堆回調函數,很多事情的是在用戶自己寫的回調函數中實現。從DXUTInit開始,程序開始調用框架內的API來完成初始化——創建窗口——創建設備——主消息循環——退出等一系列操作。調查Common目錄下DXUT.cpp文件就可以發現DXUTInit函數干了以下幾件事情
???? 設定開始調用這個函數的標志符
???? InitCommonControls
???? 保存當前的sticky/toggle/filter鍵
???? 通過事先導入winmm.dll的方法timeBeginPeriod來確保調用Sleep的準確性
???? 設定一些標志附,讀取命令行參數
???? 檢查版本
???? 獲得D3D對象指針。值得一提的是框架中大部分全局變量是通過類DXUTState的靜態變量state的get/set方法得到的。這些get/set方法是用宏定義的,里面調用了加鎖和解鎖,因此保證了全局變量設定的線程安全。這些全局性的變量包括D3D對象指針,D3D設備對象指針,BackBufferSurfaceDesc,DeviceCaps,窗口HINSTANCE,窗口句柄HWND,焦點句柄HWNDFocus,全屏設備句柄,窗口設備句柄,窗口客戶端矩形,模式切換時窗口客戶端矩形,模式切換時全屏客戶端矩形,Time,ElapsedTime,FPS數,窗口標題,設備數據DeviceStats,以及是否暫停渲染,時間是否暫停,窗口是否激活等標志,一些窗口事件等等。這些都可以通過DXUTGETXXX/DXUTSETXXX/DXUTISXXX系列包裝函數獲得。
???? 通過DXUT_Dynamic_Direct3DCreate9創建D3D對象。很多D3D底層API都是通過動態的方式加載的,這樣有利于效率的提高。
???? 重設全局時鐘
???? 設定DXUTInited為true。很多DXUT系列的函數都喜歡在入口設定一個開始調這個函數的標志,在出口設定一個這個函數已經被調過的標志,這樣可以在以后再次調用這個函數的時候了解當前什么工作已經做了,什么工作沒做需要補做。我想這個主要是用來防止函數重入問題的吧。其他函數中的這一對函數就不再提了
?
  呼~第一個函數大致看完了,接下來是DXUTCreateWindow函數。什么?要問DXUTSetCursorSettings為什么被無視?因為這個函數不重要。DXUTCreateWindow的工作大致是這樣的
???? 判斷關于設備的CallBack有沒有設定好
???? 判斷DXUTInit()有沒有被調用成功(注意不是有沒有調用)。
???? 獲得焦點句柄,因為窗口還沒有創建,所以這個句柄應該是NULL
???? 設定HInstance
???? 設定窗口類
???? 注冊窗口類
???? 設定窗口位置和大小。好長一段代碼,汗
???? 創建窗口。終于。。。
???? 設定窗口焦點句柄,全屏設備句柄,窗口設備句柄
  
  接下來的函數是DXUTCreateDevice。這個函數就是用來選擇最優設備并創建的。
???? 設定參數中的回調函數和上下文,以備后用
???? 檢查窗口是否被成功創建,否則再調用一次DXUTCreateWindow
???? 枚舉所有可能的顯示模式。枚舉過程非常復雜,用到了CD3DEnumeration中的一些包裝函數,這些設備信息包括分辨率,顏色位深等等。這里會用到DXUTCreateDevice傳進來的參數IsDeviceAcceptable
???? 如果命令行設定過顯示模式,那么將剛才得到的信息覆蓋。
???? 采用某種權重的算法找出最優顯示模式(DXUTFindValidDeviceSettings)
???? 切換設備。這里用到了DXUTCreateDevice傳進來的參數ModifyDeviceSettings。切換設備時要考慮很多問題:比如需要暫時忽略WM_SIZE消息;只有在第一次創建設備的時候才用命令行參數;按照需要調用DXUTCreate3DEnvironment和DXUTReset3DEnvironment;分全屏和窗口設備重設;重設完了根據需要處理WM_SIZE消息;顯示窗口,允許WM_SIZE消息等等
?
  最后是DXUTMainLoop。
???? 檢查是否有重入問題
???? 設定進入主循環標志
???? 檢查設備是否已經被成功創建,沒創建的話用默認參數創建一次
???? 檢查前面三個函數是否成功調用。汗,又是檢查
???? 處理窗口消息,注意只有在沒有消息處理的時候才調用DXUTRender3DEnvironment()
???? 在消息循環退出之后清除加速表。應該是類似SHIFT+X這種鍵盤加速表的清除吧
???? 更改主循環標志
?
  還是有必要看一下主消息循環中的DXUTRender3DEnvironment
???? 檢查設備是否丟失
???? 在窗口模式下檢查桌面分辨率位深設定,以便重設設備
???? 嘗試重設設備DXUTReset3DEnvironment
???? 判斷上次渲染到現在時間(elapsed time)決定是否要進行渲染
???? 調用用戶的FrameMove函數
???? 調用用戶的FrameRender函數
???? 調用Present函數
???? 更新當前Frame
???? 根據命令行檢查是否需要關閉應用程序
?
?
  主函數看完之后,剩下的就是一些回調函數了。要正確使用這些回調函數,除了知道它們的作用之外,還需要知道這些函數是何時被調用的。下面是調用順序
  • 程序啟動:InitApp MsgProc IsDeviceAcceptable ModifyDeviceSettings OnCreateDevice OnResetDevice 渲染主循環
  • 渲染主循環:OnFrameMove OnFrameRender
  • 改變設備:ModifyDeviceSettings OnLostDevice 根據需要調用OnDestroyDevice OnResetDevice 渲染主循環
  • 程序退出:OnLostDevice OnDestroyDevice
  下面是各函數的作用:
InitApp
初始化一些圖形控件和GUI的消息處理函數
OnCreateDevice
創建設備時的回調函數,用于創建D3DPOOL_MANAGED資源
OnResetDevice
重設設備時的回調函數,用于創建D3DPOOL_DEFAULT資源
OnFrameMove
動畫實現處,常用于矩陣轉換等操作
OnFrameRender
渲染實現處,常用于渲染場景
OnLostDevice
設備丟失時的回調函數,釋放由OnResetDevice創建的資源
OnDestroyDevice
設備析構時的回調函數,釋放由OnCreateDevice創建的資源
IsDeviceAcceptable
創建設備時用來對所有可用設備進行過濾的函數
ModifyDeviceSettings
更改設備時的回調函數,用于實現更改設備時所需做的其他操作
MsgProc
安排各空件處理消息的順序
OnGUIEvent
程序控件綁定的消息處理回調函數
?
  以上函數均可以更換名字,這里只是用框架默認的函數名字。
posted on 2006-11-18 09:08 李錦俊(mybios) 閱讀(2652) 評論(0)  編輯 收藏 引用 所屬分類: Direct3D
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美一级黄色录像| 久久成人免费视频| 亚洲欧美综合精品久久成人 | 国产精品久久婷婷六月丁香| 欧美成人精品激情在线观看| 久久理论片午夜琪琪电影网| 久久免费少妇高潮久久精品99| 久久国内精品自在自线400部| 久久se精品一区二区| 欧美一区二区三区精品电影| 久久国产精品亚洲77777| 久久一区激情| 欧美精品一区二区三区在线看午夜| 欧美国产先锋| 国产精品美女久久久久久久| 国产一区二区三区久久久| 韩国美女久久| 亚洲视频中文| 久久国产66| 欧美激情国产精品| 中文亚洲欧美| 久久男人av资源网站| 欧美精品日韩三级| 韩国三级电影久久久久久| 亚洲人在线视频| 久久国内精品视频| 亚洲黄色免费| 日韩一级精品| 欧美影院在线| 欧美日韩亚洲天堂| 在线精品高清中文字幕| 国产精品99久久不卡二区| 久久婷婷激情| 亚洲性夜色噜噜噜7777| 久久综合久久综合久久| 久久久九九九九| 国产精品福利久久久| 欧美午夜激情在线| 在线观看欧美日本| 午夜精品www| 最新日韩av| 久久精品在线播放| 国产欧美在线观看一区| 一本大道久久a久久精品综合 | 亚洲欧美高清| 亚洲黄页视频免费观看| 久久精品99国产精品| 国产精品欧美日韩久久| 99re视频这里只有精品| 欧美激情在线| 麻豆精品传媒视频| 樱桃视频在线观看一区| 久久天天躁夜夜躁狠狠躁2022| 亚洲欧美精品在线| 国产精品日韩精品欧美精品| 99re热精品| 亚洲欧洲日本在线| 欧美激情一区在线| 亚洲精品一区二区三区在线观看| 免费亚洲婷婷| 久久亚洲精品伦理| 欲色影视综合吧| 美女主播视频一区| 久久裸体视频| 亚洲欧洲美洲综合色网| 亚洲第一主播视频| 欧美久久影院| 亚洲自拍另类| 亚洲欧美高清| 国产色综合久久| 久久先锋影音| 久久综合久久美利坚合众国| 亚洲黄色免费电影| 91久久中文字幕| 欧美日韩综合精品| 亚洲永久免费精品| 亚洲在线第一页| 国产一区美女| 欧美激情精品久久久久久免费印度| 久久综合色8888| 一本一本a久久| 亚洲视频一区在线| 国产主播喷水一区二区| 欧美成人精品三级在线观看| 欧美激情精品久久久六区热门| 一本久久a久久精品亚洲| 夜夜嗨一区二区| 国产亚洲欧美一区在线观看| 嫩草伊人久久精品少妇av杨幂| 欧美激情网友自拍| 欧美在线视屏| 欧美黄免费看| 欧美在线free| 欧美激情精品久久久久| 欧美在线视频免费| 国际精品欧美精品| 国产午夜精品一区二区三区欧美 | 亚洲国产美女| 国产精品美女久久久久aⅴ国产馆| 久久躁狠狠躁夜夜爽| 欧美国产高清| 久久精品日韩欧美| 欧美国产日韩免费| 欧美中文字幕在线播放| 欧美高清在线视频| 久久久久久久激情视频| 欧美另类极品videosbest最新版本| 欧美一区二视频| 欧美国产日韩一区| 久久精品国产亚洲aⅴ| 欧美激情bt| 玖玖综合伊人| 国产精品亚洲综合久久| 亚洲精品免费电影| 亚洲国产精品日韩| 久久电影一区| 香蕉久久一区二区不卡无毒影院| 欧美+亚洲+精品+三区| 久久婷婷久久| 国产一区99| 亚洲欧美视频一区二区三区| 一区二区三区国产| 欧美国产日本| 亚洲电影免费观看高清完整版在线| 国产视频一区欧美| 亚洲女同在线| 欧美在线一二三| 国产精品一区视频| 亚洲小说春色综合另类电影| 99亚洲精品| 欧美日本一区二区高清播放视频| 欧美成年人视频| 亚洲电影免费在线观看| 久久伊人精品天天| 欧美激情精品久久久久久| 亚洲第一色在线| 久久久一区二区| 美日韩精品视频| 好吊色欧美一区二区三区视频| 新狼窝色av性久久久久久| 欧美在线播放一区| 国产一区二区三区在线观看免费 | 亚洲欧洲一区二区在线观看| 在线观看国产日韩| 久久久久.com| 欧美不卡视频一区发布| 亚洲福利专区| 欧美另类久久久品| 亚洲一区二区四区| 久久精品国产免费| 精品1区2区3区4区| 欧美**人妖| 一区二区电影免费在线观看| 亚洲一二三区在线观看| 亚洲一区二区三区中文字幕| 亚洲精品自在久久| 亚洲伊人第一页| 国产精自产拍久久久久久| 欧美在线视频a| 欧美激情一区二区三区全黄| 亚洲另类黄色| 国产精品护士白丝一区av| 亚洲伊人伊色伊影伊综合网| 久久精品一级爱片| 亚洲黄色在线看| 欧美日韩国产bt| 亚洲免费影视| 欧美激情91| 午夜久久资源| 最近中文字幕日韩精品| 欧美日韩免费观看中文| 欧美一区亚洲| 亚洲精品自在久久| 欧美~级网站不卡| 亚洲欧美综合精品久久成人| 亚洲国产裸拍裸体视频在线观看乱了中文 | 亚洲午夜黄色| 老牛国产精品一区的观看方式| 亚洲精品视频免费观看| 国产精品成人一区二区艾草| 久久爱www久久做| 日韩视频第一页| 美女爽到呻吟久久久久| 午夜精品久久久久久久99水蜜桃 | 久久精品国产77777蜜臀| 欧美国产免费| 欧美一区二区视频在线观看2020| 极品尤物一区二区三区| 国产精品久久国产三级国电话系列| 久久精品国内一区二区三区| 一本色道久久综合精品竹菊 | 国产亚洲一级高清| 欧美日韩精品不卡| 免费成人网www| 欧美一区二区网站| 一本综合精品| 亚洲国产日韩一区| 巨乳诱惑日韩免费av| 欧美影院在线| 亚洲欧美中文日韩v在线观看|