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

李錦俊(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)

我參與的團隊

最新隨筆

搜索

  •  

積分與排名

  • 積分 - 373514
  • 排名 - 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>
            国产精品日韩一区| 欧美一区二区在线观看| 先锋影音久久久| 亚洲欧美日韩视频一区| 国产精品久久网| 欧美亚州韩日在线看免费版国语版| 欧美久久九九| 国产精品久久久久久久9999| 国产精品日韩欧美| 黄网站色欧美视频| 亚洲精品免费一二三区| 一本到高清视频免费精品| 亚洲一级黄色| 久久野战av| 亚洲激情不卡| 一本色道久久综合狠狠躁篇怎么玩 | 性做久久久久久久久| 久久av一区二区| 亚洲国产成人av| 亚洲在线中文字幕| 免费高清在线一区| 国产精品久久久久久久久久尿| 一区二区三区在线视频免费观看| 一区二区三区欧美日韩| 久久夜色精品国产欧美乱极品| 亚洲理伦在线| 久久中文字幕一区二区三区| 国产精品高清网站| 亚洲精品视频一区二区三区| 久久精品免费播放| 亚洲日本一区二区| 久久久99精品免费观看不卡| 欧美日韩伦理在线免费| 亚洲第一福利视频| 亚洲免费在线精品一区| 欧美成ee人免费视频| 性欧美办公室18xxxxhd| 欧美视频日韩| 亚洲精品裸体| 欧美成在线观看| 欧美亚洲一区二区三区| 欧美日韩精品欧美日韩精品| 亚洲国产成人久久| 久久久久久久综合| 亚洲曰本av电影| 欧美日精品一区视频| 亚洲理论在线| 亚洲福利视频一区| 欧美大片18| 亚洲毛片一区| 欧美激情免费观看| 免费成人黄色片| 亚洲第一黄网| 国产精品成人在线| 久久久一区二区| 国产精品美女一区二区在线观看| 欧美午夜激情视频| 亚洲成人在线观看视频| 久久久精品日韩| 午夜视频在线观看一区二区三区| 欧美三级网址| 一本久道久久综合狠狠爱| 欧美成人综合网站| 久热这里只精品99re8久| 精品91在线| 久久综合伊人77777尤物| 久久国产精品久久w女人spa| 国产午夜亚洲精品不卡| 久久久久久免费| 久久国产欧美精品| 亚洲国产精品日韩| 欧美高清视频在线播放| 欧美大片免费看| 亚洲美女淫视频| 一区二区三区欧美激情| 国产精品一二三| 久久久在线视频| 蜜臀99久久精品久久久久久软件| 亚洲国产一区二区三区在线播 | 午夜精品影院在线观看| 国产在线欧美| 欧美福利视频在线| 欧美日韩一二三四五区| 欧美一区二区视频在线| 久久久国产精品亚洲一区| 亚洲人成绝费网站色www| 99国产精品一区| 亚洲精品小视频| 国产精品久久久久aaaa九色| 久久综合久色欧美综合狠狠 | 久久久91精品国产一区二区三区| 亚洲丰满在线| 亚洲美女啪啪| 国内精品久久久| 亚洲另类自拍| 极品日韩久久| 亚洲视频精选| 亚洲人成在线免费观看| 亚洲一线二线三线久久久| 国产精品亚洲视频| 久久在线免费观看| 欧美成人高清| 亚洲一区综合| 先锋影音国产一区| 在线日本成人| 亚洲人成网站在线播| 欧美激情91| 欧美在线视频免费播放| 欧美视频在线免费| 国产欧美日韩综合| 久久天天狠狠| 欧美寡妇偷汉性猛交| 亚洲一区三区电影在线观看| 亚洲欧美日韩区| 亚洲视频精品| 国产资源精品在线观看| 女同性一区二区三区人了人一| 免费av成人在线| 亚洲一级电影| 久久久久中文| 久久精品人人做人人爽电影蜜月| 国产精品扒开腿做爽爽爽软件| 亚洲激情亚洲| 亚洲国产三级| 久久尤物电影视频在线观看| 国内精品免费在线观看| 亚洲激情小视频| 亚洲国内精品在线| 久久久久久久成人| 久久精品国产2020观看福利| 国产精品jizz在线观看美国| 91久久久久久久久久久久久| 亚洲大片av| 欧美插天视频在线播放| 裸体歌舞表演一区二区| 国产亚洲观看| 欧美在线在线| 卡一卡二国产精品| 黄色资源网久久资源365| 久久国内精品视频| 久久久久女教师免费一区| 国产一区二区日韩精品欧美精品| 亚洲欧美综合国产精品一区| 午夜精品一区二区三区在线播放| 国产精品成人在线观看| 中文一区二区| 欧美一区成人| 狠狠色丁香婷综合久久| 亚洲一区二区视频| 好吊妞**欧美| 久久日韩精品| 影视先锋久久| 久久最新视频| 亚洲精品免费看| 亚洲欧美另类在线观看| 欧美性天天影院| 午夜在线一区二区| 免费亚洲电影在线| 日韩一区二区精品| 国产精品久久久久久影视| 亚洲男人的天堂在线| 国产精品高清免费在线观看| 午夜精品久久久久久久久久久| 久久亚洲综合色一区二区三区| 91久久久久久| 国产精品毛片va一区二区三区| 亚洲专区免费| 麻豆成人小视频| 一区二区三区偷拍| 国产欧美亚洲精品| 欧美成人影音| 午夜日韩福利| 亚洲国产欧美在线| 欧美影视一区| 国产精品电影在线观看| 亚洲综合成人婷婷小说| 欧美一区二区三区视频在线观看| 国产一区二区三区无遮挡| 欧美不卡一区| 亚洲欧美日韩国产综合精品二区| 乱码第一页成人| 亚洲一区成人| 尤物yw午夜国产精品视频| 欧美日韩在线精品| 另类酷文…触手系列精品集v1小说| 在线综合欧美| 亚洲国产日韩精品| 久久久久一区二区三区| 一区二区激情视频| 亚洲国产另类精品专区 | 欧美国产先锋| 久久九九热免费视频| 亚洲综合99| 99精品欧美一区二区三区| 国产三级欧美三级| 国产精品人人爽人人做我的可爱| 欧美激情精品久久久久久免费印度| 欧美在线一二三区| 午夜精品久久久久久99热| 99riav1国产精品视频|