1. 程式人生 > >DirectX 9 UI設計學習筆記之二:第2章Introducing DirectX+第3章Introducing Direct3D

DirectX 9 UI設計學習筆記之二:第2章Introducing DirectX+第3章Introducing Direct3D

       此文由哈利_蜘蛛俠原創,轉載請註明出處!有問題歡迎聯絡本人!

上一期的地址:

       別看這一期似乎要講很多內容,其實大部分是一帶而過的。其實我的重點在於弄了一個框架程式;詳情見本期最後。

2章 Introducing DirectX

======================================================================

       這一章對於DX做了一個簡單介紹。主要打算回答以下問題:

1What is DirectX?DX 是啥?)

2What APIs does it include?(它包括哪些

API?)

3What other features does DirectX include?DirectX 還有哪些其他功能?)

4Why use it?(為何使用它?)

5From where is DirectX obtained?(從哪裡獲得DirectX?)

6What are its minimum requirements?(它最低的要求是什麼?)

7What’s the difference between Debug and Retail mode?Debug 模式和Retail 模式的區別是什麼?)

8How is DirectX installed?(如何安裝

DirectX?)

9How can Visual C++ be configured to use DirectX?(如何設定VC++以便使用DirectX?)

第2.1節.DirectX----WhatIs It?

       簡言之,DirectX 是PC 平臺上的遊戲的執行環境和開發環境之一。它包含這麼幾個部分:

1Direct3D ----Graphics。它是DirectX 的圖形部分,也是最龐大的部分。

2DirectInput---- Keyboards, Mice, and Joysticks。輸入部分,支援鍵盤、滑鼠和遊戲杆(還有其他)。

3DirectMusicand DirectSound ---- MIDI and WAV

。聲音部分,支援MIDI WAV 格式的聲音檔案(其實還支援很多其它格式)。

4DirectPlay---- Networking。網路連線部分。

5DirectShow---- Programmable Media Player。可程式設計媒體播放器。

第2.2節.DirectX----OtherFeatures

       DX 還包括一些有用的小程式,為我們的遊戲開發過程提供便利。它們包括:

1Mesh Viewer。用於預覽轉換成.X 檔案的網格模型的小程式。在DX June 2010 版中已經沒有了。

2Error Lookup。輸入一個值,就可以顯示對應的錯誤程式碼。現在它的名字叫做DXErr

3Caps Viewer。能夠用於檢視電腦上的硬體(顯示卡、音效卡等等)的能力。現在它的名字叫做DXCapsViewer

4GraphEditDirectShow的一個工具,用於編輯聲音檔案和視訊檔案。可惜現在已經沒有了。

5Texture Tool。用於建立紋理和編輯紋理的一個小軟體。現在它的名字叫做DxTex

第2.3節.SystemRequirements

       講了安裝DirectX9 SDK 的系統需求。放心,現代人的電腦都可以安裝。

第2.4節.Where toObtain DirectX

       答案是微軟官網。

第2.5節.Installation

       很簡單,基本沒什麼好說的。注意兩點:安裝前解除安裝老版本的DX;安裝失敗的話(比如說安裝完畢後提示有錯誤程式碼),試試重新安裝。

第2.6節.InstalledFiles

       告訴我們安裝完畢後安裝資料夾下有哪些東西。大家自行檢視即可。

第2.7節.ConfiguringVisual C++

       講了用Visual Studio 執行DirectX 時如何設定。這個有點複雜,不過用過的人應該很熟悉了。我會在今後釋出的每個程式碼中附上使用說明的,大家不用擔心。

第2.8節.Coding withHungarian Notation

       這裡簡要介紹了匈牙利命名法。也是DX 程式設計師比較喜歡的命名法。

======================================================================

第3章 IntroducingDirect3D

======================================================================

       這一章主要打算回答如下問題:

1How mathematics is used to express positions and represent transformations(如何用數學來表示位置以及變換)

2How a Direct3D application is created and configured in Visual C++(在Visual C++中,如何建立並設定Direct3D 應用程式)

3The programmatic requirements of a Direct3D projectDirect3D 工程的程式設計需求)

4How images can be rendered to the screen(如何將圖形渲染到螢幕上)

5How to perform special effects like alpha blending(如何實現像alpha 混合這樣的特效)

第3.1節.Direct3DConcepts----Overview and Mathematics

       講了一些基本的數學概念。其實推薦讀者看看“龍書”第二版(Frank D. Luna 的《Introduction to 3D Game Programmingwith DirectX 9.0c: A Shader Approach》)的前幾章,講得非常詳細。

第3.2節.GettingStarted

       這裡寫了一個小小的Windows程式。

第3.3節.ProgrammingDirect3D Applications

       這裡講述了讓Direct3D程式在螢幕上渲染圖形所需要採取的六大步驟:

1Initialize Direct3D(初始化Direct3D)。

2Create a 3D device(建立一個3D 裝置)。

3Configure the device for rendering(設定裝置以供渲染)。

4Initialize world data(初始化世界資料)。

5Render(渲染)。

6Release Direct3D objects(釋放Direct3D 物件)。

第3.4節.InitializingDirect3D

第3.5節.Creating aDirect3D Device----A Graphics Card

第3.6節.Preparingto Render

       這幾節具體講了第3.3節中提到的幾大步驟的詳情。

第3.7節.InitializingWorld Data

       這是第3.3節中提到的第四步。一般的Direct3D 程式在這裡需要載入3D模型等等;但是對於UI 設計而言,由於我們主要與2D 圖形打交道,所以我們介紹的是Direct3D surfaces 和Direct3D textures。前者一般的3D遊戲程式設計書上不會提到,所以大家要仔細了!

1Direct3DSurfaces ---- IDirect3DSurface9surfaces 一開始是空白的,並且不會立即被繪製到螢幕上。事實上,我們需要載入影象,然後在後來某一時刻將其繪製出來。我們通過 Direct3D 裝置的CreateOffscreenPlainSurface方法來建立一個 IDirect3DSurface9 介面。注意surfaces 和後面要講的textures 的大小應該為2的次冪。

2Direct3DSurfaces ---- Loading Image Files。在建立了一個surface 後,我們可以從硬碟中把影象載入到該surface 上面。這是通過D3DXLoadSurfaceFromFile 函式來實現的。注意:為了建立一個寬高與所載入的圖片尺寸匹配的surface,我們首先呼叫D3DXGetImageInfoFromFile 函式來填充一個D3DXIMAGE_INFO 結構體,然後將這個變數傳遞到CreateOffscreenPlainSurface 函式中。

3Direct3DSurfaces ---- RenderingDirect3D 首先將物體渲染到一個特殊的離屏surface (叫做back buffer,後臺快取)上。Surfaces 可以通過surface 複製的過程繪製到後臺快取上。surface 複製是通過 IDirect3DDevice9 UpdateSurface 方法實現的。這裡我們需要獲得指向後臺快取的一個指標,而這個是通過IDirect3DDevice9介面的GetBackBuffer 方法而完成的。

4Direct3DTextures ---- IDirect3DTexture9Textures 可以看成是升級版的surfaces;它們可以移動、縮放和旋轉,並且可以對映到3D 模型的面板上。我們可以通過D3DXCreateTextureFromFile 函式來一次性地建立和載入一個texture

5Direct3DTextures ---- Preparing to RenderTextures surfaces 是不同的;我們不能夠直接將其複製到後臺快取上去。相反,我們需要使用另外一個介面,叫做 ID3DXSprite。該介面可以將任意數目的 textures 直接繪製到後臺快取中。我們通過 D3DXCreateSprite函式來建立 ID3DXSprite 介面。

6Direct3DTextures ---- Rendering。要繪製 textures,如前所述,需要藉助 ID3DXSprite 介面。我們一共要呼叫該介面的如下幾種方法:Begin方法,SetTransform 方法(可以藉助 D3DXMatrixTransformation2D 方法來生成一個2D 變換矩陣),Draw 方法以及End 方法。

第3.8節.AlphaBlending

這一節講的是Alpha 混合,主要講了如何用Adobe Photoshop、Paint Shop Pro 以及DX 自帶的DxTex 程式為影象新增alpha 通道的方法,最後講了如何在Direct3D 中啟用Alpha 混合。這些都比較簡單。

======================================================================

       最後到了奉送程式碼的時間了!下面就是我為本書前四章量身定做的程式碼!

       當然,其實並不是我做的,而且思路也跟書上的不一樣。其實這個程式碼是我參考了“龍書”第二版和“龍書”第四版的框架程式碼、然後花了很多的時間修改而成的。它目前的功能包括:顯示FPS、每幀耗時、總執行時間(不包括程式停止,也就是跳轉到其他程式的時間)、視窗的寬高比、最大最小化、支援 Direct Input、按Ctrl+Enter 鍵在視窗模式和全屏模式之間切換等等。不過現在這個程式碼有點小bug,就是在全屏的時候,按Alt+Tab 鍵切換出去的時候會出錯。咳,以後再慢慢改吧!

       程式碼的使用方法參見壓縮資料夾內部的ReadMe.txt 檔案(以後同理,不再贅述)。

       祝大家學習愉快!