■ DirectX 9 Program
摘要: 在三維圖形程序設(shè)計(jì)中,網(wǎng)格模型占有非常重要的地位,而且也是比較復(fù)雜的部分,特別是包含動(dòng)畫和蒙皮信息的網(wǎng)格模型。
.x文件格式最初是為傳統(tǒng)的Direct3D保留模式而設(shè)計(jì)的,在DirectX 6.0問世后,針對立即模式對它作過一次擴(kuò)展。要想在Direct3D程序中靈活自如地使用網(wǎng)格模型,應(yīng)當(dāng)深入理解.x文件格式。
閱讀全文
摘要: 紋理映射在三維圖形程序設(shè)計(jì)中具有非常重要的作用,三維場景中的許多特殊效果都是通過紋理映射來實(shí)現(xiàn)的。例如通過紋理映射模擬復(fù)雜的光照效果,物體表面對周圍環(huán)境的反射效果等。
Direct3D最多支持8層紋理,也就是說,在一個(gè)三維物體的表面可以同時(shí)擁有1~8張不同的紋理貼圖。Direct3D能夠在一個(gè)渲染過程中把這些紋理顏色依次混合,渲染到同一個(gè)物體的表面。每一個(gè)紋理層對應(yīng)0~7的索引序號(hào),多層紋理映射能夠模擬更為真實(shí)的三維世界。
閱讀全文
摘要: 圖形系統(tǒng)中為了獲得當(dāng)前運(yùn)行程序的相關(guān)信息,往往需要在屏幕上顯示文本,Direct3D的功能擴(kuò)展接口ID3DXFont對此提供了方便的解決方法。
使用接口ID3DXFont繪制文本,首先需要通過函數(shù)D3DXCreateFont()創(chuàng)建ID3DXFont字體對象。ID3DXFont接口封裝了 Windows字體和Direct3D設(shè)備指針,D3DXCreateFont()函數(shù)通過Windows字體和Direct3D設(shè)備指針創(chuàng)建 ID3DXFont對象。
閱讀全文
摘要: 霧化效果是計(jì)算機(jī)圖形學(xué)中應(yīng)用最廣的效果之一,它不僅能顯著地增加視覺效果的真實(shí)感,并可以提供一定的深度感。在實(shí)時(shí)圖形程序,特別是游戲設(shè)計(jì)程序中,為了確保圖形系統(tǒng)的運(yùn)行速度,圖形開發(fā)人員往往在位于觀察點(diǎn)遠(yuǎn)處的場景使用較為簡單的三維模型,甚至不繪制物體,而在近處使用復(fù)雜模型,這樣就可能造成物體變形、突然出現(xiàn)或突然消失等失真現(xiàn)象,霧化效果可以有效地避免這種失真現(xiàn)象。
閱讀全文
摘要: 在繪制復(fù)雜的三維場景時(shí),不可避免地會(huì)出現(xiàn)物體間的相互遮擋,在這種情況下,為了正確地繪制場景需要使用深度測試。半透明物體的繪制不同于不透明物體, Direct3D通過alpha混合實(shí)現(xiàn)半透明物體的繪制。深度測試可以簡化復(fù)雜場景的繪制,alpha混合可以使繪制的三維場景更完整、更逼真。
在復(fù)雜的場景中,通常有多個(gè)物體需要繪制,這些物體之間通常會(huì)存在遮擋關(guān)系,離觀察點(diǎn)較遠(yuǎn)的物體會(huì)因?yàn)榻幬矬w的者的遮擋而不可見或只有部分可見,Direct3D圖形系統(tǒng)提供了深度測試功能來實(shí)現(xiàn)這種效果。
閱讀全文
摘要: 利用.x文件模型渲染三維模型,首先需要將.x文件中的各種數(shù)據(jù)分別加載到內(nèi)存中,主要包括頂點(diǎn)數(shù)據(jù)、材質(zhì)數(shù)據(jù)和紋理數(shù)據(jù)等。
Direct3D擴(kuò)展實(shí)用庫定義了多邊形網(wǎng)格模型接口ID3DXMesh來表示一個(gè)復(fù)雜的三維物體模型,它是一個(gè)COM接口,繼承自ID3DXBaseMesh。
Direct3D擴(kuò)展實(shí)用庫函數(shù)D3DXCreateMesh()可用于創(chuàng)建一個(gè)Direct3D網(wǎng)格模型對象。
閱讀全文
摘要: 為了使渲染的圖形看起來更真實(shí),Direct3D提供了在物體表面繪制紋理的功能。一般說來,紋理是表示物體表面細(xì)節(jié)的一幅或幾幅二維圖形,也稱紋理貼圖(texture)。當(dāng)把紋理按照特定的方式映射到物體表面的時(shí)候,能使物體看上去更加真實(shí)。當(dāng)前流行的圖形系統(tǒng)中,紋理繪制已經(jīng)成為一種必不可少的渲染方法。在理解紋理映射時(shí),可以將紋理看作應(yīng)用程序在物體表面的像素顏色。在真實(shí)世界中,紋理表示一個(gè)對象的顏色、圖案以及觸覺特征。但在Direct3D 中,紋理只表示對象表面的彩色圖案,它不能改變對象的幾何形式。更進(jìn)一步說,它只是一種高強(qiáng)度計(jì)算行為。
閱讀全文
摘要: Ambient lighting provides constant lighting for a scene. It lights all object vertices the same because it is not dependent on any other lighting factors such as vertex normals, light direction, light position, range, or attenuation. It is the fastest type of lighting but it produces the least realistic results. Direct3D contains a single global ambient light property that you can use without creating any light. Alternatively, you can set any light object to provide ambient lighting.
閱讀全文
摘要: 在三維圖形程序中使用光照效果能夠有效地增強(qiáng)場景的真實(shí)感。在Direct3D中,通過計(jì)算場景中的光線和物體表面材質(zhì)反射光線顏色的數(shù)學(xué)交互,可使光線模型接近于真實(shí)世界的照明系統(tǒng)。
在真實(shí)世界中,光線在到達(dá)眼睛之前經(jīng)過了物體表面的多次反射,每次反射時(shí),物體表面都會(huì)吸收一些光,有些被隨機(jī)反射擴(kuò)散出去,其余的到達(dá)下一個(gè)物體的表面或眼睛。真實(shí)世界中光線反射的效果就是光線跟蹤算法需要模擬實(shí)現(xiàn)的。盡管光線跟蹤算法能夠創(chuàng)建非常逼真的與自然界中觀察到極為相似的景象,但是還沒有實(shí)時(shí)程序能夠完成這些運(yùn)算。考慮到實(shí)時(shí)渲染的需要,Direct3D使用更簡單的方法進(jìn)行光照計(jì)算。Direct3D光照計(jì)算模型包括4種:環(huán)境光、漫反射光、鏡面反射光和自發(fā)光。它們的結(jié)合能靈活高效地解決三維圖形程序中的光照問題。
閱讀全文
摘要: 空間中的物體需要使用三維坐標(biāo)來描述,而顯示器是一個(gè)二維的表面,所以在屏幕上渲染一個(gè)三維場景時(shí),首先需要將描述空間物體的三維坐標(biāo)變換為二維坐標(biāo)(世界坐標(biāo)到屏幕坐標(biāo)),這在Direct3D中稱為頂點(diǎn)坐標(biāo)變換。頂點(diǎn)坐標(biāo)變換通常通過矩陣來完成。可以把頂點(diǎn)坐標(biāo)變換想象成攝像過程,三維世界的景物通過攝像機(jī)的拍攝顯示在二維的相片上,所不同的是把相片換成了屏幕。
閱讀全文
摘要: 顏色在Direct3D中占據(jù)比較重要的位置,所有的操作無論是光照還是紋理貼圖,其結(jié)果最終都?xì)w結(jié)到如何影響每個(gè)頂點(diǎn)或像素的顏色。
Direct3D資源是指用來渲染一個(gè)場景的紋理或緩沖區(qū)。應(yīng)用程序需要?jiǎng)?chuàng)建、加載、復(fù)制、使用資源。Direct3D所有的資源,包括幾何數(shù)據(jù)資源 IDirect3DIndexBuffer9、IDirect3DVertexBuffer9等,都繼承于接口IDirect3DResource9。紋理資源IDirect3DCubeTexture9,IDirect3DTexture9和IDirect3DVolumeTextre9是從接口 IDirect3DResource9的子接口IDirect3DBaseTexture9中繼承而來的。
閱讀全文
摘要: 圖元(primitives)是Direct3D中定義的基本圖形表示,它是組成一個(gè)單一實(shí)體的一組頂點(diǎn)。最簡單的圖元是三維坐標(biāo)系中多個(gè)點(diǎn)的集合,稱為點(diǎn)列表(point list)。通常,圖元是多邊形(polygon),一個(gè)多邊形是由至少三條邊組成的封閉圖形。最簡單的多邊形是三角形,Direct3D使用三角形來構(gòu)成大多數(shù)其他多邊形,這是因?yàn)槿切蔚娜齻€(gè)頂點(diǎn)肯定是共面的,而渲染不共面的頂點(diǎn)效率比較低。通過組合三角形可以形成更大、更復(fù)雜的多邊形和網(wǎng)格(mesh)。
閱讀全文
摘要: Microsoft Direct3D的一種實(shí)現(xiàn)方式是通過組件對象模型(Component Object Model, COM)及其接口實(shí)現(xiàn)的,在用C++語言和COM接口方式開發(fā)的程序中可以直接訪問這些接口和對象。Direct3D對象是Direct3D程序中需要?jiǎng)?chuàng)建的第一個(gè)對象,也是需要最后一個(gè)釋放的對象,這里所說的對象是指COM對象。通過Direct3D對象,可以枚舉和檢索Direct3D設(shè)備,這樣應(yīng)用程序就可以在不需要?jiǎng)?chuàng)建設(shè)備對象的前提下選擇Direct3D渲染設(shè)備。
閱讀全文
摘要: FinalPos = MeshPos + ∑( Difference_i * Weight_i)
= MeshPos + ∑( (NewMeshPos_i - MeshPos) * Weight_i )
= MeshPos + ∑( (MeshPos × OffsetMatix_i × CombinedMatrix_i - MeshPos) * Weight_i ) [1]
閱讀全文
摘要: 假設(shè)用戶點(diǎn)擊了屏幕上的點(diǎn) s (x, y)。 從圖15.1我們能看到用戶選取了茶壺。無論如何,應(yīng)用程序無法根據(jù)給定的s點(diǎn)就立即確定茶壺是被選取。
我們知道一些知識(shí):關(guān)于茶壺和它的關(guān)聯(lián)點(diǎn)s,茶壺投影在圍繞s點(diǎn)的區(qū)域,更準(zhǔn)確的說是:它投影到投影窗口上圍繞p點(diǎn)的區(qū)域,與它對應(yīng)的屏幕點(diǎn)是s。因?yàn)檫@個(gè)問題依賴于3D物體與它的投影之間的關(guān)系,我們看圖15.2就可以了解。
閱讀全文
摘要: 許多自然現(xiàn)象是由很多小的小顆粒組成的,它們有相似的行為。(例如,雪花落下,閃爍的火焰,沖出槍管的“子彈”),粒子系統(tǒng)用來模擬這種現(xiàn)象。
粒子是一個(gè)很小的對象,它通常用來模擬數(shù)學(xué)中的一個(gè)點(diǎn)。點(diǎn)元是用來顯示粒子的很好的方案,可是點(diǎn)元被光柵化成一個(gè)簡單的像素。這沒給我們多少靈活性,因?yàn)槲覀兿胗懈鞣N大小不同的粒子,并且把整個(gè)紋理平滑映射到這些粒子上。在Direct3D 8.0以前,因?yàn)辄c(diǎn)元方法的局限性而完全不使用他們。代替的方法是程序員將使用公告板去顯示粒子,一個(gè)板是一個(gè)方格,世界矩陣用它來確定方向,使它總是朝向照相機(jī)。
閱讀全文
摘要: 實(shí)際上,地形網(wǎng)格不比三角形網(wǎng)格復(fù)雜,圖13.1.(a)所示,網(wǎng)絡(luò)的每個(gè)頂點(diǎn)指定了高度,格子模型用這種方式顯示從山脈到河流的平滑過渡。圖13.1 (b),模擬自然地形。當(dāng)然,我們可以用漂亮的紋理表現(xiàn)沙石地,綠色的山丘。圖13.1.(c)雪山效果。
閱讀全文
摘要: 我們使用D3DXMatrixLookAtLH函數(shù)來計(jì)算視圖空間變換矩陣。這個(gè)函數(shù)對于在固定位置布置和對準(zhǔn)攝像機(jī)是非常好用的,不過它的用戶接口對于要響應(yīng)用戶輸入來實(shí)現(xiàn)攝像機(jī)移動(dòng)就不那么好用了。這就激發(fā)我們用我們自己的方法來解決,這里我們展示了怎樣實(shí)現(xiàn)一個(gè)Camera類,它使我們能夠比 D3DXMatrixLookAtLH函數(shù)更好地操作攝像機(jī),并且可以用來作為飛行模擬攝像機(jī)和第一人稱視角攝像機(jī)。
閱讀全文
摘要: ID3DXMesh接口的主要功能繼承自ID3DXBaseMesh父接口,了解這些是很重要的,其它一些mesh接口如ID3DXPMesh也是繼承自ID3DXBaseMesh。
閱讀全文
摘要: 在D3DX庫中提供了一個(gè)ID3DXFont接口,它能被用于在Direct3D應(yīng)用程序中繪制文字。
閱讀全文
摘要: 模板緩存是一個(gè)離屏緩存,我們能夠用它來完成一些特效。模板緩存與后臺(tái)緩存和深度緩存有相同的定義,因此在模板緩存中的像素與后臺(tái)緩存和深度緩存中的像素是相協(xié)調(diào)的。就象名字所說,模板緩存就象一個(gè)模板它允許我們刷新渲染后緩存的某個(gè)部分。
閱讀全文
摘要: 我們介紹一種叫做混合(blending)的技術(shù),它允許我們混合像素,我們通常用已經(jīng)光柵化的像素光柵化同一位置的像素。換句話說就是我們在圖元上混合圖元,這種技術(shù)允許我們完成多種特效。
閱讀全文
摘要: 紋理映射是一種允許我們?yōu)槿切钨x予圖象數(shù)據(jù)的技術(shù);這讓我們能夠更細(xì)膩更真實(shí)地表現(xiàn)我們的場景。例如,我們能夠創(chuàng)建一個(gè)立方體并且通過對它的每個(gè)面創(chuàng)建一個(gè)紋理來把它變成一個(gè)木箱(如圖6.1)。
在Direct3D中一個(gè)紋理是通過IDirect3DTexture9接口來表現(xiàn)的,一個(gè)紋理是一個(gè)類似像素矩陣的表面它能夠被映射到三角形上。
閱讀全文
摘要: 為了提高場景的真實(shí)性,我們可以為其加入燈光。燈光也能幫助表現(xiàn)物體的立體感以及物體的實(shí)體形狀。當(dāng)使用燈光時(shí),我們不再自己指定頂點(diǎn)的顏色; Direct3D中每個(gè)頂點(diǎn)都通過燈光引擎來計(jì)算頂點(diǎn)顏色,該計(jì)算是基于定義的燈光資源,材質(zhì)以及燈光資源關(guān)心的表面方向。通過燈光模型計(jì)算頂點(diǎn)顏色會(huì)得到更真實(shí)的場景。
閱讀全文
摘要: 在Direct3D中,顏色是使用RGB三部分來描述的。也就是說,我們要分別指定紅、綠和藍(lán)三種顏色的值。混合這三個(gè)顏色決定最終的顏色。利用這三種顏色我們能夠表現(xiàn)數(shù)萬種顏色。
我們使用兩種不同的結(jié)構(gòu)來存儲(chǔ)RGB數(shù)據(jù)。這第一種是D3DCOLOR,它實(shí)際上是一個(gè)DWORD類型即32位。在D3DCOLOR類型中的這些位按照8-bit被分為4個(gè)部分,每一部分存儲(chǔ)的是該色的亮度值。如圖4.1所示。
閱讀全文
摘要: 頂點(diǎn)和索引緩存有相似的接口并且共享相似的方法;因此我們把它們合在一起講解。一個(gè)頂點(diǎn)緩存是一塊連續(xù)的存儲(chǔ)了頂點(diǎn)數(shù)據(jù)的內(nèi)存。同樣的,一個(gè)索引緩存是一塊連續(xù)的存儲(chǔ)了索引數(shù)據(jù)的內(nèi)存。我們使用頂點(diǎn)和索引緩存保存我們的數(shù)據(jù)是因?yàn)樗鼈兡鼙环胖迷陲@存中。渲染顯存中的數(shù)據(jù)要比渲染系統(tǒng)內(nèi)存中的數(shù)據(jù)快的多。
閱讀全文
摘要: 這次主題是渲染管線。它是用來創(chuàng)建為3D世界進(jìn)行幾何描述的2D圖形并設(shè)定一個(gè)虛擬照相機(jī)確定這個(gè)世界中哪一部分將被透視投影到屏幕上。
閱讀全文
摘要: Direct3D是一種低層圖形API,它能讓我們利用3D硬件加速來渲染3D世界。我們可以把Direct3D看作是應(yīng)用程序和圖形設(shè)備之間的中介。例如通知圖形設(shè)備清空屏幕,應(yīng)用程序?qū)⒄{(diào)用Direct3D的IDirect3DDevice9::Clear方法。圖1.1顯示了應(yīng)用程序、 Direct3D和圖形設(shè)備之間的關(guān)系。
閱讀全文
摘要: 幾何學(xué)中,我們用有向線段表示向量,如圖1。向量的兩個(gè)屬性是他的長度和他的頂點(diǎn)所指的方向。因此,可以用向量來模擬既有大小又有方向的物理模型。例如,以后我們要實(shí)現(xiàn)的粒子系統(tǒng)。我們用向量來模擬粒子的速度和加速度。在3D計(jì)算機(jī)圖形學(xué)中我們用向量不僅僅模擬方向。例如我們常常想知道光線的照射方向,以及在3D世界中的攝象機(jī)。向量為在3維空間中表示方向的提供了方便。
閱讀全文
摘要: 網(wǎng)絡(luò)是指多臺(tái)計(jì)算機(jī)互聯(lián)以進(jìn)行數(shù)據(jù)傳輸及通信的系統(tǒng)。除了兩個(gè)或更多的計(jì)算機(jī)之外,網(wǎng)路還需要有網(wǎng)絡(luò)互聯(lián)軟件(或一個(gè)網(wǎng)路操作系統(tǒng))、網(wǎng)絡(luò)適配器以及電纜。網(wǎng)絡(luò)適配器有各種形狀和大小,但是一般都采用調(diào)制解調(diào)器的形狀。實(shí)際上,調(diào)制解調(diào)器就是一個(gè)網(wǎng)路適配器,它能夠?qū)⒁慌_(tái)計(jì)算機(jī)通過世界上最大的網(wǎng)絡(luò)-- -互聯(lián)網(wǎng)連接到數(shù)百萬臺(tái)計(jì)算機(jī)上。
網(wǎng)絡(luò)互聯(lián)模型有三種基本類型:服務(wù)器端、客戶端以及點(diǎn)對點(diǎn)。
閱讀全文
摘要: DirectX是由微軟公司建立的游戲編程接口。由C++編程語言實(shí)現(xiàn),遵循COM。在Windows的平臺(tái)上影響力超越OpenGL并被多數(shù)PC 游戲開發(fā)商采用。最新版本DirectX9.0c (2006年12月13日)。另外,Windows Vista第5238版亦包含有 DirectX 10 的 Beta 版。
很多Windows游戲需要DirectX。DirectX包含DirectGraphic、DirectPlay、 DirectSound、DirectInput、DirectSetup等部份。 (Direct3D與DirectDraw已整合成DirectGraphic,而DirectShow亦已自原本的DirectX SDK中移到Windows平臺(tái)SDK了。 Redist Package 是媒體開發(fā)底層API,通過它可以開發(fā)游戲和其它媒體應(yīng)用程序。
閱讀全文
摘要: 音樂就是一系列的音符,這些音符在不同的時(shí)間用不同的幅度被播放或者停止。有非常多的指令被用來播放音樂,但是這些指令的操作基本相同,都在使用各種各樣不同的音符。在計(jì)算機(jī)上進(jìn)行作曲,實(shí)際上是存儲(chǔ)了很多組音樂,回放時(shí)由音頻硬件將這些音符播放出來。
閱讀全文
摘要: DirectInput是一些COM對象的集合(和所有DirectX組件相同),這些COM對象描繪了輸入系統(tǒng)和各個(gè)輸入設(shè)備。最主要的對象是DirectInput8,它用于初始化系統(tǒng)以及創(chuàng)建輸入設(shè)備
閱讀全文
摘要: 三維物體表面的各個(gè)剖分三角形構(gòu)成了一個(gè)所謂的網(wǎng)格(Mesh),使用3D建模軟件繪制三維圖象,可取得網(wǎng)格的頂點(diǎn)坐標(biāo),頂點(diǎn)紋理坐標(biāo)以及三角形面的材質(zhì)等數(shù)據(jù),并可將這些數(shù)據(jù)保存到相應(yīng)的三維圖象文件中。此時(shí)調(diào)用DirectX提供的網(wǎng)格接口函數(shù),讀取三維圖象文件的頂點(diǎn)數(shù)據(jù),就可對三維物體表面進(jìn)行渲染處理。
閱讀全文
摘要: 渲染管道流水線通常需要將來自頂點(diǎn)的顏色,紋理像素的顏色,光照顏色以及物體表面材質(zhì)反射光顏色進(jìn)行混合,生成計(jì)算機(jī)屏幕的像素顏色。將多種顏色混合在一起,必須考慮各種顏色的成分比例,這個(gè)比例由Alpha因子決定。對于游戲開發(fā)來說,利用Alpha顏色混合可產(chǎn)生背景透明的渲染效果。
閱讀全文
摘要: 紋理是指物體表面本身所具有的圖案,可采用貼圖的方法將一張二維圖象張貼到一個(gè)三維物體的表面,這就是所謂的紋理貼圖技術(shù)。與材質(zhì)一樣,紋理也是物體表面的一種屬性,同時(shí)結(jié)合材質(zhì),光照和紋理技術(shù)可對三維場景進(jìn)行渲染,使渲染出來的三維圖形更為逼真。
閱讀全文
摘要: 在最底層的層次中,Direct3D并不使用網(wǎng)格模型,而只是使用多邊形。D3DX增強(qiáng)了Direct3D系統(tǒng)的功能性,添加了一系列負(fù)責(zé)處理網(wǎng)格模型的容器和進(jìn)行渲染的對象。.X文件是微軟公司所開發(fā)的,高度通用的三維模型存儲(chǔ)格式。它是模板驅(qū)動(dòng)并完全可擴(kuò)展,這就意味著可以使用它來滿足文件存儲(chǔ)的所有需求。一個(gè).X文件,正如它的文件擴(kuò)展名所表明的,是非常通用的。它可以是基于文本的,以便更容易進(jìn)行編輯;或者是基于二進(jìn)制的,這樣可以使文件更小,并且更容易地進(jìn)行保護(hù)以便不被窺視。整個(gè).X文件格式是基于模板的,非常類似于C語言結(jié)構(gòu)。
為了讀取并處理一個(gè).X文件,可以利用COM對象的一個(gè)小集合來解析從頭到尾在.X文件中所遇到的每個(gè)數(shù)據(jù)對象。將數(shù)據(jù)對象作為一個(gè)字節(jié)的數(shù)組進(jìn)行處理;僅僅是將數(shù)組轉(zhuǎn)換為一種可使用的結(jié)構(gòu),以便能夠容易地訪問到包含在對象里的數(shù)據(jù)。
閱讀全文
摘要: 在渲染多邊形網(wǎng)格對象到場景中的時(shí)候,離觀察者越遠(yuǎn)的對象應(yīng)該越模糊,同時(shí)離觀察者越近的物體應(yīng)該越清楚,這就是深度排序(depth sorting)。深度排序有兩種常用的方法。
第一種方法稱為畫家算法(painter's algorithm)。這種方法將對象劃分成不同的多邊形,由后往前對這些多邊形進(jìn)行排序,再按照排好的順序繪制出這些多邊形。采用這種方法繪制多邊形,能夠確保前面的多邊形總是在其后多邊形之前進(jìn)行繪制。
深度排序的第二種方法稱為z緩沖方法(z-buffer),它是圖形硬件設(shè)備使用最多的方法。這種方法依賴于像素,每個(gè)像素都有一個(gè)z值(z值是像素距離觀察者的距離)。當(dāng)每個(gè)像素被寫入時(shí),渲染器首先檢查是否已經(jīng)存在一個(gè)z值更小的像素,如果不存在,這個(gè)像素就被繪制出來;如果存在,就跳過該像素。
閱讀全文
摘要: 大爆炸,煙霧痕跡甚至魔術(shù)飛彈尾部發(fā)出的微小火花,都是粒子(particle)所制造出來的特殊效果。在適當(dāng)?shù)臅r(shí)機(jī),啟用alpha混合并繪制粒子,這樣粒子就能朝向觀察點(diǎn)(使用公告板),得到的結(jié)果就是混合對象的抽象拼貼,他們可以用于創(chuàng)建一些奇妙的效果。
粒子奇妙的地方就在于粒子的大小實(shí)際上是任意的,原因在于可以創(chuàng)建一個(gè)縮放矩陣,使其同粒子多邊形的世界變換矩陣結(jié)合起來。也就是說,除非粒子紋理不同,否則只需要使用一個(gè)多邊形來繪制所有的粒子,無論如何,多邊形的數(shù)目都必須同紋理的數(shù)目保持一致。
閱讀全文
摘要: 公告板(billboard)是一種允許在2D對象出現(xiàn)在3D中的很酷的技術(shù),公告板的原理就是通過使用世界矩陣,根據(jù)觀察點(diǎn)來排列多邊形,因?yàn)橛^察的角度已知(或能夠獲得一個(gè)觀察變換矩陣),就只需要使用相反的觀察角來構(gòu)造矩陣。創(chuàng)建公告板世界矩陣的方法是從Direct3D獲取當(dāng)前的觀察矩陣并將此矩陣轉(zhuǎn)置。這個(gè)轉(zhuǎn)置矩陣會(huì)將所有的東西進(jìn)行恰當(dāng)?shù)亩ㄎ唬猿蛴^察點(diǎn)。接著就只需應(yīng)用網(wǎng)格的平移矩陣,在世界中正確地確定網(wǎng)格的位置。
閱讀全文
摘要: 字體的繪制需要使用ID3DXFont對象和 D3DXCreateFontIndirect函數(shù)。
DirectX SDK文檔對ID3DXFont做了簡要的說明:
The ID3DXFont interface encapsulates the textures and resources needed to render a specific font on a specific device.
The ID3DXFont interface is obtained by calling D3DXCreateFont or D3DXCreateFontIndirect.
閱讀全文
摘要: 在設(shè)置可變頂點(diǎn)格式時(shí)加入法線和漫反色,如下所示:
// The 3D vertex format and descriptor
typedef struct
{
float x, y, z; // 3D coordinates
float nx, ny, nz; // normals
D3DCOLOR diffuse; // color
} VERTEX;
#define VERTEX_FVF (D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_DIFFUSE)
閱讀全文
摘要: 設(shè)置可變頂點(diǎn)格式時(shí)增加一個(gè)D3DCOLOR類型的漫反射分量,其中的alpha值指定了alpha混合因子。
// The 2D vertex format and descriptor
typedef struct
{
float x, y, z; // 2D coordinates
float rhw; // rhw
D3DCOLOR diffuse; // diffuse color component
} VERTEX;
閱讀全文
摘要: 思路與"一個(gè)用D3D繪制2D圖形的例子"相差不多,主要的區(qū)別在頂點(diǎn)的數(shù)據(jù)結(jié)構(gòu)定義不一樣。
2D的VERTEX結(jié)構(gòu)定義為:
// The 2D vertex format and descriptor
typedef struct
{
float x, y, z; // 2D coordinates
float rhw; // rhw
float u, v; // texture coordinates
} VERTEX;
#define VERTEX_FVF (D3DFVF_XYZRHW | D3DFVF_TEX1)
閱讀全文
摘要: 思路如下:
(1)函數(shù)Do_Init初始化D3D,D3D設(shè)備,頂點(diǎn)緩沖,紋理;主要調(diào)用這幾個(gè)函數(shù):
Direct3DCreate9,GetAdapterDisplayMode,CreateDevice,CreateVertexBuffer, Lock,Unlock,D3DXCreateTextureFromFile。
(2)函數(shù)Do_Frame繪制一幀,主要調(diào)用這幾個(gè)函數(shù):
Clear,BeginScene,EndScene,SetStreamSource,SetFVF,SetTexture, DrawPrimitive。
(3)函數(shù)Do_Shutdown釋放D3D資源。
閱讀全文
摘要: 相信這里沒有人沒玩過采用骨骼動(dòng)畫技術(shù)的游戲,看看那些熱門的動(dòng)作游戲,例如《波斯王子》、《分裂細(xì)胞》和《戰(zhàn)神》,你就知道骨骼動(dòng)畫的威力了(我承認(rèn)是猜的)。骨骼動(dòng)畫技術(shù)用來使我們的3D模型在屏幕上動(dòng)起來,通過和動(dòng)作捕捉技術(shù)結(jié)合,可以讓模型做出非常逼真的動(dòng)作。而這樣一個(gè)極具威力的技術(shù),其原理卻相當(dāng)簡單。
假設(shè)我們要讓游戲主角做出一個(gè)動(dòng)作,例如波斯王子拿彎刀往前一劈。最簡單的方法,就是讓模型師建一個(gè)動(dòng)畫序列,然后在程序中逐幀播放,就像放電影一樣。不過這樣一來工作量就太大了,玩家也需要N個(gè)G的硬盤來安裝這個(gè)游戲。與此不同,骨骼動(dòng)畫技術(shù)采用了一種很聰明的方式。首先,建模師完成一個(gè)標(biāo)準(zhǔn)姿勢的3D模型,通常是雙手沿著肩的方向伸展平放,雙腳打開。所有的后繼動(dòng)作將由這個(gè)基礎(chǔ)動(dòng)作演變得到。
閱讀全文
摘要: 物體表面光澤是由于表面的反射光刺激人的眼睛視網(wǎng)膜而引起的一種視官感覺,這種色覺實(shí)際上是由光的波長決定的。每種波長的光在光譜中占據(jù)一定的位置,具有特定的色澤和亮度。
對于任意波長為s的光,由于s可分解為s = aR + bG + cB,其中R,G,B為紅色光,綠色光和藍(lán)色光的波長,于是在RGB為基底的情況下,光波長由三元數(shù)(a, b, c)來決定。因此光的顏色值量化可以這樣來進(jìn)行:首先用顏色值(1, 0, 0)表示紅色R,用顏色值(0, 1, 0)表示綠色G,用(0, 0, 1)表示藍(lán)色B,而任意波長的光的顏色值C則可用(r, g, b)表示,以表明顏色s = aR + bG + cB 是用RGB三色通過混色而得來的,其中r, g和b取區(qū)間的浮點(diǎn)數(shù)。
閱讀全文
摘要: 在世界空間中,面向攝影機(jī)的三維物體的剖分三角形面為前面,是可視的;背向攝影機(jī)的三角形面稱為背面,是不可視的。對于可視的前面進(jìn)行渲染顯示,對于不可視的背面則不進(jìn)行渲染處理,這就是所謂的背面剔除。
為了省去繁雜的前面和背面的計(jì)算判斷,DirectX將依據(jù)寫入頂點(diǎn)緩沖區(qū)的三角形面3個(gè)頂點(diǎn)的順(逆)時(shí)針方向來定義該面為前面或背面,以直接規(guī)定三角形面是否顯示。在DirectX的默認(rèn)情形下,如果寫入頂點(diǎn)緩沖區(qū)的三角形面的3個(gè)頂點(diǎn)為順時(shí)針方向,那么這3個(gè)頂點(diǎn)構(gòu)成的三角形面被認(rèn)為是前面,必須進(jìn)行渲染顯示。相反,如果3個(gè)頂點(diǎn)的順序?yàn)榉磿r(shí)針,則為背面三角形,不需要渲染處理。
閱讀全文
摘要: DirectX Graphics提供的編程接口包括Direct3D組件和D3DX擴(kuò)展組件,利用DirectX Graphics可以一致地處理二維和三維的圖形渲染,而不再需要應(yīng)用早期DirectX版本下的DirectDraw組件進(jìn)行二維圖形的顯示處理。
首先來看看三維物體的成像過程。三維物體可通過建模的微分方法,把彎曲的表面切分為一個(gè)個(gè)的三角形面,這樣三維物體表面的繪制,就轉(zhuǎn)化為物體表面中所有三角形面的繪制。要渲染由眾多三維物體組成的三維場景,需要先引入局部坐標(biāo)系,為場景中的各個(gè)三維物體進(jìn)行三角形頂點(diǎn)的坐標(biāo)量化。
閱讀全文
摘要: 時(shí)鐘類GE_TIMER可用來取得游戲已進(jìn)行的時(shí)間,計(jì)算出兩個(gè)時(shí)間點(diǎn)之間的時(shí)間片大小,從而可在某一時(shí)間點(diǎn)處,自動(dòng)更新某些游戲狀態(tài)。此外,還可用來獲取程序的幀頻FSP(Frame Per Second)大小,檢驗(yàn)3D渲染的速度,即游戲速度。
閱讀全文
摘要: 注:GE是GameEngine的縮寫。
GE_APP類解決應(yīng)用程序的窗口創(chuàng)建問題,為了突出消息處理,這個(gè)類并沒有更抽象地將窗口程序地消息循環(huán)體代碼進(jìn)行封裝。因此,這里的應(yīng)用程序架構(gòu)是創(chuàng)建窗口(包括注冊窗口類,創(chuàng)建窗口,顯示窗口,設(shè)置窗口回調(diào)函數(shù)的默認(rèn)處理),然后繼續(xù)使用消息循環(huán)體,讀取鍵盤和鼠標(biāo)的輸入等,進(jìn)行一幀的渲染或其他處理。
閱讀全文
摘要: 前回同大家簡單介紹了如何用 DirectInput 來進(jìn)行鍵盤編程,本回所要講述的就該是關(guān)于如何使用 DirectInput 來對另一個(gè)非常重要的輸入設(shè)備----鼠標(biāo)的編程問題。
鼠標(biāo)的編程同鍵盤編程的過程是非常相似的,有了上次的基礎(chǔ),你很快就能看出兩者在形式上其實(shí)完全是大同小異的。
閱讀全文
摘要: 設(shè)計(jì)一個(gè)PC游戲,鍵盤鼠標(biāo)的輸入是絕不能少。Windows也提供了諸如 WM_LBUTTONDOWN、WM_RBUTTONUP等鼠標(biāo)消息以及WM_KEYDOWN、WM_KEYUP等鍵盤輸入消息。但是 DirectInput中仍然提供了對鼠標(biāo)鍵盤的支持,其原因就是DirectInput提供一個(gè)更直接更快捷的對輸入設(shè)備的訪問方法。就象我們在DOS 下直接接管鍵盤中斷,而不是去用什么討厭的INT16來處理鍵盤輸入一樣。
閱讀全文
摘要: 游戲編程可不僅僅是圖形程序的開發(fā)工作,實(shí)際上包含了許多方面,本文所要講述的就是關(guān)于如何使用 DirectInput 來對鍵盤編程的問題。
在 DOS 時(shí)代,我們一般都習(xí)慣于接管鍵盤中斷來加入自己的處理代碼。但這一套生存方式在萬惡的 Windows 社會(huì)下是行不通的,我們只能靠領(lǐng) API 或者 DirectInput 的救濟(jì)金過活。
在 Windows 的 API 中,有一個(gè) GetAsyncKeyState() 的函數(shù)可以返回一個(gè)指定鍵的當(dāng)前狀態(tài)是按下還是松開。這個(gè)函數(shù)還能返回該指定鍵在上次調(diào)用 GetAsyncKeyState() 函數(shù)以后,是否被按下過。雖然這個(gè)函數(shù)聽上去很不錯(cuò),但現(xiàn)在領(lǐng)這種救濟(jì)金的程序員是越來越少了。原因無它,只因?yàn)?DirectInput 的救濟(jì)金比這豐厚,而且看上去似乎更專業(yè)?
閱讀全文
摘要: DirectInput是Directx的一個(gè)組件接口,提供了大量的接口函數(shù)處理用戶在鍵盤,鼠標(biāo),游戲桿以及力反饋等游戲裝置上的輸入,而且 DirectInput是直接與硬件驅(qū)動(dòng)程序打交道,因此DirectInput可較快的處理用戶的輸入。另一方面,正是由于DirectInput直接與驅(qū)動(dòng)程序進(jìn)行通信,所以在控制面板上所作的任何鍵盤和鼠標(biāo)的屬性設(shè)置(如鍵盤按鍵的延遲重復(fù)率和鼠標(biāo)的左右手習(xí)慣等),都不會(huì)對應(yīng)用 DirectInput的程序起作用,除非是修改由驅(qū)動(dòng)程序提供的屬性設(shè)置。
閱讀全文
摘要: 攝影坐標(biāo)系的原點(diǎn)為世界坐標(biāo)系中的觀察位置eye點(diǎn),z軸與觀察方向(從eye點(diǎn)出發(fā)到at點(diǎn)的向量)一致。
由于僅由一個(gè)坐標(biāo)原點(diǎn)的位置和一個(gè)z坐標(biāo)軸的方向不足以完全確定一個(gè)坐標(biāo)系,因此,還需要指定一個(gè)up向量來定位攝影坐標(biāo)系的y軸方向。這個(gè)在世界坐標(biāo)系中給出的up向量是不必與觀察方向垂直的,只是指明攝影坐標(biāo)系應(yīng)該以向上的方向還是以向下的方向作為y軸。
閱讀全文
摘要: 將三維物體表面剖分為一系列的三角形面,物體的光照亮度處理就轉(zhuǎn)化為對這些平面三角形的照明處理,從而可簡單地通過平面三角形的法向量與光的入射方向的夾角,來確定各種入射光對平面上每一點(diǎn)說貢獻(xiàn)的亮度值。
對于三角形3個(gè)頂點(diǎn)p0,p1,p2構(gòu)成的平面,選取一個(gè)垂直于該平面的法向量n。假設(shè)點(diǎn)p為平面上的任意一點(diǎn),由于n . (p - p0) = 0,從而n . p - n . p0 = 0,由此展開向量的點(diǎn)積運(yùn)算可知,平面程序具有如下的一般形式:ax+by+cz+d=0。如果要具體求出平面的方程,可取n=(p1-p0) x (p2 - p0)計(jì)算出來。
閱讀全文
摘要: 大家都知道,一個(gè)3D 場景中,我們見到的任何光輝燦爛的物體,都是由一個(gè)一個(gè)面片組成的。而裝載面片位置信息的就是其各個(gè)定點(diǎn)的三維坐標(biāo)。這是用來在模型中存儲(chǔ)的,而要把物體顯示在屏幕上,還需要將它們轉(zhuǎn)換成顯示器上的二維坐標(biāo)。這就需要對每個(gè)點(diǎn)實(shí)施一套 3 to 2 的轉(zhuǎn)換公式,在Direct3D中叫做“幾何流水線”(Geometry Pipeline)。
閱讀全文
摘要: 向量的運(yùn)算已超了傳統(tǒng)意義上的數(shù)的運(yùn)算,因?yàn)橄蛄坎⒉皇且话愕臄?shù)字。這意味著一切可用符號(hào)表示出來的事物,都可以對其進(jìn)行各種關(guān)系運(yùn)算,而不必關(guān)心事物的本身。這種符號(hào)運(yùn)算的觀點(diǎn),推動(dòng)了近代數(shù)學(xué)對一般的集合元素進(jìn)行的抽象代數(shù)方面的研究。
在線性方程組的求解上,變元較少的方程組(如僅有兩個(gè)未知數(shù)x和y的方程組)的解很容易表達(dá)出來,但是推廣到較為復(fù)雜的更多變元的情形,如何推測方程組的解以及如何用確定的式子表達(dá)出來,引發(fā)了對行列式的提出和研究。行列式實(shí)質(zhì)上是方陣數(shù)據(jù)的一種運(yùn)算,由此自然地想到,可對一般行列數(shù)據(jù)定義代數(shù)運(yùn)算,就像對向量定義運(yùn)算一樣,這就是矩陣運(yùn)算的產(chǎn)生歷史。
閱讀全文
摘要: 首先來看看向量,向量的坐標(biāo)表示對于DirectX游戲開發(fā)來說是必須的,在世界坐標(biāo)系或投影坐標(biāo)系下的三角形面的法線,光線的方向和觀察者的方向等都是通過向量的坐標(biāo)形式來準(zhǔn)確給出的。
DirectX的頭文件D3DX9Math.h給出了兩個(gè)結(jié)構(gòu)體來支持向量的計(jì)算:
閱讀全文
摘要: 今天在學(xué)習(xí)DirectX 9 SDK的時(shí)候,碰到了一個(gè)問題,提示我:
This application has failed to start because d3dx9_25.dll was not found.
上網(wǎng)查了下,找到了原因,英文就不翻譯了,再也找不到英文比我還爛的人了 ^_^
閱讀全文