人機交互習(xí)題講解.doc

上傳人:小** 文檔編號:13266032 上傳時間:2020-06-11 格式:DOC 頁數(shù):24 大?。?34.42KB
收藏 版權(quán)申訴 舉報 下載
人機交互習(xí)題講解.doc_第1頁
第1頁 / 共24頁
人機交互習(xí)題講解.doc_第2頁
第2頁 / 共24頁
人機交互習(xí)題講解.doc_第3頁
第3頁 / 共24頁

下載文檔到電腦,查找使用更方便

5 積分

下載資源

還剩頁未讀,繼續(xù)閱讀

資源描述:

《人機交互習(xí)題講解.doc》由會員分享,可在線閱讀,更多相關(guān)《人機交互習(xí)題講解.doc(24頁珍藏版)》請在裝配圖網(wǎng)上搜索。

1、動漫游戲開發(fā)技術(shù)習(xí)題集 1.向量有哪些重要屬性?舉例說明,在3D游戲中向量的作用。 向量的兩個重要屬性是長度和方向。在3D游戲中可以表示例子的速度和加速度,光線的走向,多邊形的朝向。 2.向量的數(shù)學(xué)表示方法以及在D3D中采用何種結(jié)構(gòu)體來表示一個三維向量。 數(shù)學(xué)表示方法:N=(Nx,Ny,Nz)。 D3D中 typedef struct D3DVECTOR {float x,y,z;} D3DVECTOR; 3.向量長度的計算方法以及如何在D3D中計算向量的長度。 ||u||=sqrt(Ux*Ux+Uy*Uy+Uz*Uz) 在D3D中, FLOAT D3DXVec3

2、Length(CONST D3DVECTOR3 *pV); D3DXVECTOR3 v(1.0f, 2.0f, 3.0f); float magnitude = D3DXVec3Length( &v ); // = sqrt(14) 4.向量的加、減,數(shù)乘、點積、叉積運算方法,并用簡單的程序?qū)崿F(xiàn)上述運算。 ; D3DXVECTOR3 u(2.0f, 0.0f, 1.0f); D3DXVECTOR3 v(0.0f, -1.0f, 5.0f); // (2.0 + 0.0, 0.0 + (-1.0), 1.0 + 5.0) D3DXVECTOR3 sum = u + v; //

3、= (2.0f, -1.0f, 6.0f) D3DXVECTOR3 u(2.0f, 0.0f, 1.0f); D3DXVECTOR3 v(0.0f, -1.0f, 5.0f); D3DXVECTOR3 difference = u - v; // = (2.0f, 1.0f, -4.0f) D3DXVECTOR3 u(1.0f, 1.0f, -1.0f); D3DXVECTOR3 scaledVec = u * 10.0f; // = (10.0f, 10.0f, -10.0f) FLOAT D3DXVec3Dot( // Returns the result. CO

4、NST D3DXVECTOR3* pV1, // Left sided operand. CONST D3DXVECTOR3* pV2 // Right sided operand.); D3DXVECTOR3 u(1.0f, -1.0f, 0.0f); D3DXVECTOR3 v(3.0f, 2.0f, 1.0f); // 1.0*3.0 + -1.0*2.0 + 0.0*1.0 // = 3.0 + -2.0 float dot = D3DXVec3Dot( &u, &v ); // = 1.0 D3DXVECTOR3 *D3DXVec3Cross( D3DXVEC

5、TOR3* pOut, // Result. CONST D3DXVECTOR3* pV1, // Left sided operand. CONST D3DXVECTOR3* pV2 // Right sided operand. ); 5.在D3D中如何表示一個4*4的矩陣。在D3D中如何獲得一個平移、旋轉(zhuǎn)、比例變換矩陣。 平移 D3DXMATRIX *D3DXMatrixTranslation( D3DXMATRIX* pOut, // 返回平移后的矩陣. FLOAT x, // x軸移動的單位 FLOAT y, // y軸移動的單位 F

6、LOAT z // z軸移動的單位); 旋轉(zhuǎn) D3DXMATRIX *D3DXMatrixRotationX( D3DXMATRIX* pOut, // 返回旋轉(zhuǎn)后的矩陣 FLOAT Angle // Angle是旋轉(zhuǎn)的弧度 ); 比例 D3DXMATRIX *D3DXMatrixScaling( D3DXMATRIX* pOut, // 返回縮放后的矩陣 FLOAT sx, // x軸縮放的比例 FLOAT sy, // y軸縮放的比例 FLOAT sz // z軸縮放的比例.); 6.如果一個物體先向X軸正向平移5個單位,然后繞Y軸旋轉(zhuǎn)45度并整體放大2

7、倍,請求出該物體對應(yīng)的旋轉(zhuǎn)矩陣。 7.已知平面的一個點P0以及垂直于該平面的一條法向矢量n,請表示出該平面,并采用適當?shù)某绦騽?chuàng)建該平面。 該平面為p點的集合,n*(p-p0)=0; 這里a, b和c是平面法向量n的成員,d就是那個常數(shù)。 8.如何判斷一個點是否在某個平面上? 例如,假設(shè)平面(n, d),我們能判定點p和平面的關(guān)系: 假如np + d = 0,那么點p與平面共面。 假如np + d >0,那么點p在平面的前面且在平面的正半空間里。 假如np + d <0,那么點p在平面的背面且在平面的負半空間里。 9.編寫簡短程序判斷某

8、計算機是否支持頂點和像素著色。 bool supportsHardwareVertexProcessing; // 如果為真,意味著硬件設(shè)備支持它 if( caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT ) { // 支持 supportsHardwareVertexProcessing = true;} Else { // 不支持 hardwareSupportsVertexProcessing = false;} 10.在D3D中表面的含義是什么?用什么來描述表面?編寫程序?qū)⒈砻娲鎯^(qū)中的每個像素設(shè)置為藍色。 表面是一個像素點陣,

9、在代碼中,我們可以使用IDirect3DSurface9接口來描述表面。 // 假定_surface是一個指向IDirect3DSurface9接口的指針 // 假定每個像素為:32-bit的像素格式 // 取得表面描述 D3DSURFACE_DESC surfaceDesc; _surface->GetDesc(&surfaceDesc); // 取得被鎖定表面的像素數(shù)據(jù)的指針 D3DLOCKED_RECT lockedRect; // 假定_surface是一個指向IDirect3DSurface9接口的指針 // 假定每個像素為:32-bit的像素格式 // 取得

10、表面描述 D3DSURFACE_DESC surfaceDesc; _surface->GetDesc(&surfaceDesc); // 取得被鎖定表面的像素數(shù)據(jù)的指針 D3DLOCKED_RECT lockedRect; _surface->LockRect( &lockedRect, // 指向被鎖定表面的數(shù)據(jù) 0, // 0表示鎖定全部表面 0); // 0表示沒有指定鎖定標記 // 遍例表面上的每個像素,將它們設(shè)為紅色 DWORD* imageData = (DWORD*)lockedRect.pBits; for(int i = 0; i <

11、surfaceDesc.Height; i++) { for(int j = 0; j < surfaceDesc.Width; j++) { // 取得紋理索引, 注意我們用pitch 除以4是因為pitch的單位是字節(jié), // 并且一個DWORD類型占為4 bytes空間 int index = i * lockedRect.Pitch / 4 + j;//四個字節(jié)為一個像素,即32位的 imageData[index] = 0xff0000ff; // 每個像素設(shè)為藍色 } } typedef struct _D3DLOCKED_RECT { IN

12、T Pitch; // 表面深度 void *pBits; // 指向表面開始處的內(nèi)存 } D3DLOCKED_RECT; _surface->UnlockRect(); 11.多重采樣對圖形的顯示有何影響? 由于使用像素矩陣來表示圖像,在顯示時會出現(xiàn)鋸齒狀,Multisampling就是使其變得平滑的技術(shù)。它的一種最普通的用法即為——全屏抗鋸齒。 12.D3D中像素的格式有哪些?請舉例說明。 像素格式是由D3DFORMAT枚舉類型的一個成員來定義的 D3DFMT_R8G8B8——表示一個24位像素,從左開始,8位分配給紅色,8位分配給綠色,8位分配給藍色。 D3DFM

13、T_X8R8G8B8——表示一個32位像素,從左開始,8位不用,8位分配給紅色,8位分配給綠色,8位分配給藍色。 D3DFMT_A8R8G8B8——表示一個32位像素,從左開始,8位為ALPHA通道,8位分配給紅色,8位分配給綠色,8位分配給藍色。 D3DFMT_A16B16G16R16F——表示一個64位浮點像素,從左開始,16位為ALPHA通道,16位分配給藍色,16位分配給綠色,16位分配給紅色。 D3DFMT_A32B32G32R32F——表示一個128位浮點像素,從左開始,32位為ALPHA通道,32位分配給藍色,32位分配給綠色,32位分配給紅色。 13.內(nèi)存、顯存以及AG

14、P存儲區(qū)有何區(qū)別? 在程序中讀取顯存和AGP內(nèi)存都是非常慢的。因此,假如你在運行時需要讀取你的幾何物體,最好的方案是指定一塊系統(tǒng)內(nèi)存,都在其中拷貝并且讀取數(shù)據(jù) 14.深度緩存有什么作用,他存儲了什么信息? 深度緩沖也是一個表面,但它不是用來存儲圖像數(shù)據(jù)的,而是用來記錄像素的深度信息。它將確定哪一個像素最后被繪制出來。深度緩沖為每一個像素計算深度值,并進行深度測試。通過深度測試,我們可以比較出哪個像素離照相機更近,并將它畫出來。這樣就可以只繪制最靠近照相機的像素,被遮住的像素就不會被畫出來。 15.如何檢測某顯示卡是否支持硬件頂點運算? bool supportsHardwareVer

15、texProcessing; // 如果為真,意味著硬件設(shè)備支持它 if( caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT ) {// 支持 supportsHardwareVertexProcessing = true;} else{// 不支持 hardwareSupportsVertexProcessing = false;} 16.如何實現(xiàn)Direct3D的初始化,需要完成哪些工作? 根據(jù)下邊的步驟你能初始化Direct3D: 1. 獲得一個IDirect3D9接口指針。這個接口用于獲得物理設(shè)備的信息和創(chuàng)建一個IDirect3D

16、Device9接口,它是一個代表我們顯示3D圖形的物理設(shè)備的C++對象。 2. 檢查設(shè)備能力(D3DCAPS9),搞清楚主顯卡是否支持硬件頂點處理。我們需要知道假如它能支持,我們就能創(chuàng)建IDirect3DDevice9接口。 3. 初始化一個D3DPRESENT_PARAMETERS結(jié)構(gòu)實例,這個結(jié)構(gòu)包含了許多數(shù)據(jù)成員允許我們指定將要創(chuàng)建的IDirect3DDevice9接口的特性。 4. 創(chuàng)建一個基于已經(jīng)初始化好的D3DPRESENT_PARAMETERS結(jié)構(gòu)的IDirect3DDevice9對象。它是一個代表我們顯示3D圖形的物理設(shè)備的C++對象。 17.在D3D中頂點如何表示,并

17、舉例說明。 struct ColorVertex { float _x, _y, _z; // 位置 DWORD _color; // 顏色}; struct NormalTexVertex { float _x, _y, _z; // 位置 float _nx, _ny, _nz; // 法線向量 float _u, _v; // 紋理坐標}; 18.在D3D中頂點索引如何表示,并舉例說明。 我們創(chuàng)建一個頂點列表和一個索引列表(index list)。頂點列表包含所有不重復(fù)的頂點,索引列中則用頂點列中定義的值來表示每一個三角形的構(gòu)造方式?;氐侥莻€矩形的示例上來,它

18、的頂點列表的構(gòu)造方式如下: Vertex vertexList[4] = {v0, v1, v2, v3}; 索引列表則定義頂點列中的頂點是如何構(gòu)造這兩個三角形的: WORD indexList[6] = {0, 1, 2, //三角形0 0, 2, 3}; //三角形1 也就是說,用頂點列表中的0(vertexList[0])、1(vertexList[1])和2(vertexList[2])頂點構(gòu)成三角形0;用頂點列表中的0(vertexList[0])、2(vertexList[2])和3(vertexList[3])頂點構(gòu)成三角形1。 19.請簡要說明攝像擺

19、放的位置和方向,裁剪面的大小對觀察3D場景中的物體有何影響? 20.物體局部坐標系在游戲設(shè)計中有何用處? 為什么有了全局坐標系后還需要有世界坐標系和觀察坐標系? 自身坐標系簡化了建模的過程。在物體自己的坐標系中建模比在世界坐標系中直接建模更容易。例如,在自身坐標系中建模不像在世界坐標系中要考慮本物體相對于其他物體的位置、大小、方向關(guān)系。 我們需要把它們都放到同一個世界坐標系中,世界變換通常是用平移、旋轉(zhuǎn)、縮放操作來設(shè)置模型在世界坐標系中的位置、大小、方向。世界變換就是通過各物體在世界坐標系中的位置、大小和方向等相互之間的關(guān)系來建立所有物體。 在世界坐標系中當照相機是

20、任意放置和定向時,投影和其它一些操作會變得困難或低效。為了使事情變得更簡單,我們將照相機平移變換到世界坐標系的源點并把它的方向旋轉(zhuǎn)至朝向Z軸的正方向。 21.編寫簡單程序?qū)崿F(xiàn)將局部坐標系轉(zhuǎn)換成世界坐標系,以及如何將世界坐標系轉(zhuǎn)換成觀察坐標系. //創(chuàng)建立方體的世界矩陣(一個平移矩陣) D3DXMATRIX cubeWorldMatrix; D3DXMatrixTranslation(&cubeWorldMatrix, -3.0f, 2.0f, 6.0f); //創(chuàng)建球體的世界矩陣(一個平移矩陣) D3DXMATRIX sphereWorldMatrix; D3DXMatrix

21、Translation(&sphereWorldMatrix, 5.0f, 0.0f, -2.0f); // 變換立方體,然后繪制它 Device->SetTransform(D3DTS_WORLD, &cubeWorldMatrix); drawCube(); // draw the cube // 因為球體使用一個不同的世界變換,我們必須更改世界矩陣為球體的~, // 如果不更改,球體將繪制在上一個世界矩陣的位置上(立方體的世界矩陣) Device->SetTransform(D3DTS_WORLD, &sphereWorldMatrix); drawSphere

22、(); // 繪制球體 D3DXMATRIX *D3DXMatrixLookAtLH( D3DXMATRIX* pOut, // 指向返回的視圖矩陣 CONST D3DXVECTOR3* pEye, // 照相機在世界坐標系的位置 CONST D3DXVECTOR3* pAt, // 照相機在世界坐標系的目標點 CONST D3DXVECTOR3* pUp // 世界坐標系的上方向(0, 1, 0) ); D3DXVECTOR3 position(5.0f, 3.0f, –10.0f); D3DXVECTOR3 targetPoint(0.0f, 0.0f, 0

23、.0f); D3DXVECTOR3 worldUp(0.0f, 1.0f, 0.0f); D3DXMATRIX V; D3DXMatrixLookAtLH(&V, &position, &targetPoint, &worldUp); 22.描述一個投影矩陣需要有哪些參數(shù),這些參數(shù)有什么含義? D3DXMATRIX *D3DXMatrixPerspectiveFovLH( D3DXMATRIX* pOut, // 返回的投影矩陣 FLOAT fovY, // 用弧度表示的視野角度vertical field of view angle in radians FLOAT

24、 Aspect, // 寬高比 FLOAT zn, // 前裁剪面距離 FLOAT zf // 后裁剪面距離); 23.如何創(chuàng)建一個頂點緩存和一個索引緩存,在對相應(yīng)的緩存進行讀寫操作前必須首先做什么? HRESULT IDirect3DDevice9::CreateVertexBuffer( UINT Length, DWORD Usage, DWORD FVF, D3DPOOL Pool IDirect3DVertexBuffer9** ppVertexBuffer, HANDLE* pSharedHandle ); HRESULT IDirect

25、3DDevice9::CreateIndexBuffer( UINT Length, DWORD Usage, D3DFORMAT Format, D3DPOOL Pool, IDirect3DIndexBuffer9** ppIndexBuffer, HANDLE* pSharedHandle ); 我們通過一個指針獲得緩存數(shù)據(jù)必須使用Lock方法。當我們訪問完緩存后必須對它解鎖。一旦有一個指向內(nèi)存的指針,我們就能對它進行讀寫。 24.如何使用頂點緩存和索引緩存繪制相應(yīng)的物體,繪制前必須首先完成什么工作? 1、 設(shè)置資源流。設(shè)置資源流與一個頂點緩存掛鉤,此流就是

26、一個流入渲染管線的幾何信息的流。 下面的方法是用于設(shè)置一個資源流: HRESULT IDirect3DDevice9::SetStreamSource( UINT StreamNumber, IDirect3DVertexBuffer9* pStreamData, UINT OffsetInBytes, UINT Stride ); 2、設(shè)置頂點格式。在這里我們指定后面用來繪圖調(diào)用的頂點的頂點格式。 _device->SetFVF( D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_TEX1 ); 3、設(shè)置索引緩存。假如我們使用了索引緩存,我

27、們必須設(shè)置后面要用于繪制操作的索引緩存。每次我們只能使用一個索引緩存;因此假如你需要用一個不同的索引緩存繪制一個物體時,你必須轉(zhuǎn)換到另一個上。下面的代碼設(shè)置一個索引緩存: _device->SetIndices( _ib ); // 傳遞一個索引緩存指針的拷貝 25.D3D中顏色怎么表示? 請編寫程序繪制一個帶顏色的茶壺. 3DCOLOR類型中的這些位按照8-bit被分為4個部分,每一部分存儲的是該色的亮度值。如圖4.1所示。 圖4.1 每種顏色占用內(nèi)存的一個字節(jié),各顏色亮度值的取值范圍是0-255。這個值越接近0就越暗,越接近255就越亮。 ? 26.在D3D中,主要有

28、哪幾種光照模型? Direct3D支持三種類型的光源。 l 點光源——這種光源在世界坐標中有一個位置且向所有方向上都照射光線。 l 方向光源——這種光源沒有位置但是向指定方向發(fā)出平行光線。 l 聚光燈——這種類型的光源和手電筒的光類似;它有位置并且發(fā)出的光在指定方向上按照圓錐形照射。這個圓錐形有兩個角度,θ和φ。角度θ描述內(nèi)圓錐,φ描述外圓錐。 27.在D3D中,材質(zhì)用什么結(jié)構(gòu)體表示,每個參數(shù)的含義是什么?對物體的顯示有何影響? 在代碼中通過D3DMATERIAL9結(jié)構(gòu)描述一個材質(zhì)。 typedef struct _D3DMATERIAL9 { D3DCOLORVALUE

29、 Diffuse, Ambient, Specular, Emissive; float Power; } D3DMATERIAL9; l Diffuse——指定此表面反射的漫射光數(shù)量。 l Ambient——指定此表面反射的環(huán)境光數(shù)量。 l Specular——指定此表面反射的鏡面光數(shù)量 l Emissive——這個是被用來給表面添加顏色,它使得物體看起來就象是它自己發(fā)出的光一樣。 Power——指定銳利的鏡面高光;它的值是高光的銳利值 28.在D3D中光源用什么結(jié)構(gòu)體表示?其每個參數(shù)的含義以及相互之間有何關(guān)系? 在代碼中一個燈光資源是通過D3DLIGHT9結(jié)構(gòu)來表現(xiàn)

30、的。 typedef struct _D3DLIGHT9 { D3DLIGHTTYPE Type; D3DCOLORVALUE Diffuse; D3DCOLORVALUE Specular; D3DCOLORVALUE Ambient; D3DVECTOR Position; D3DVECTOR Direction; float Range; float Falloff; float Attenuation0; float Attenuation1; float Attenuation2; float Theta; float Phi;

31、 } D3DLIGHT9; l Type——定義燈光類型,我們能夠使用下面三種類型之一:D3DLIGHT_POINT, D3DLIGHT_SPOT, D3DLIGHT_DIRECTIONAL l Diffuse——此光源發(fā)出的漫射光顏色。 l Specular——此光源發(fā)出的鏡面光顏色。 l Ambient——此光源發(fā)出的環(huán)境光顏色。 l Position——用一個向量來描述的光源世界坐標位置。這個值對于燈光的方向是無意義的。 l Direction——用一個向量來描述的光源世界坐標照射方向。這個值不能用在點光源上。 l Range——燈光能夠傳播的最大范圍。這個值不能比大。且不

32、能用于方向光源。 l Falloff——這個值只能用在聚光燈上。它定義燈光在從內(nèi)圓錐到外圓錐之間的強度衰減。它的值通常設(shè)置為1.0f。 l Attenuation0, Attenuation1, Attenuation2——這些衰減變量被用來定義燈光強度的傳播距離衰減。它們只被用于點光源和聚光燈上。Attenuation0定義恒定衰減,Attenuation1定義線性衰減,Attenuation2定義二次衰減。適當?shù)氖褂眠@個公式,D是代表到光源的距離,A0,A1,A2與Attenuation0,1,2相匹配。 l Theta——只用于聚光燈;指定內(nèi)圓錐的角度,單位是弧度。 l Ph

33、i——只用于聚光燈;指定外圓錐的角度,單位是弧度。 29.如果希望在一個場景中添加光照,需要哪些步驟才能完成? 給場景增加燈光的步驟是: 1、 允許使用燈光。 2、 為每個物體創(chuàng)建材質(zhì)并且在渲染相應(yīng)物體前應(yīng)將材質(zhì)附予物體。 3、 創(chuàng)建一個或多個光源,設(shè)置它們,把它們設(shè)為可用。 4、 將其他附加光源設(shè)為可用,比如鏡面高光。 30.在D3D中如何通過圖像文件獲取紋理數(shù)據(jù)? 紋理數(shù)據(jù)通常是從存儲在磁盤中的圖片文件中讀取的,且被讀進IDirect3DTexture9對象中。我們能夠使用下面的D3DX函數(shù)完成這項工作: HRESULT D3DXCreateTextureFrom

34、File( LPDIRECT3DDEVICE9 pDevice, // device to create the texture LPCSTR pSrcFile, // filename of image to load LPDIRECT3DTEXTURE9* ppTexture // ptr to receive the created texture ); 這個函數(shù)能夠讀取下面圖片格式中的任意一種:BMP,DDS,DIB,JPG,PNG,TGA。 例如,用一個名為stonewall.bmp的圖片創(chuàng)建一個紋理,我們將按照下面的例子來寫: IDirect3Dtexture9

35、* _stonewall; D3DXCreateTextureFromFile(_device, "stonewall.bmp", &_stonewall); 31.在D3D中如何創(chuàng)建一個多級漸進紋理? 由某一紋理創(chuàng)建一系列分辨率逐漸減小的紋理圖像,并且對每種分辨率下的紋理所采用的過濾方式進行定制,以便保存那些較重要的細節(jié)。 32.如何對2個像素之進行融合處理?融合的目的是什么? 面的公式是用來混合兩個像素值的: 上面的所有變量都是一個4D顏色向量(r,g,b,a),并且符號是表示分量相乘。 l OutputPixel——混合后的像素結(jié)果。 l SourcePixel——通

36、常被計算的像素,它是利用在后緩存中的像素來被混合的。 l SourceBlendFactor——在[0,1]范圍內(nèi)的一個值。它指定源像素在混合中的百分比。 l DestPixel——在后緩存中的像素。 l DestBlendFactor——在[0,1]范圍內(nèi)的一個值。它指定目的像素在混合中的百分比。 源和目的混合要素使我們能夠按照多種途徑改變原始源和目的像素,允許實現(xiàn)不同的效果。 33.簡要討論融合因子對融合效果的影響。 通過設(shè)置不同的融合因子,我們能夠創(chuàng)造很多不同的混合效果。 34.試采用兩種不同的方法創(chuàng)建Alpah通道。 Alpha部分主要是用來指定像素的透明等級,Alph

37、a通道是額外的設(shè)置位,用它來保存每一個點的alpha值。1使用DirectX紋理工具來創(chuàng)建一個帶alpha通道的DDS文件,DDS文件能夠利用D3DXCreateTextureFromFile被讀進紋理中,就象bmp和jpg文件一樣,圖像自動的按照24位RGB紋理被讀取,我們需要將該紋理增加為32位ARGB紋理,增加的是額外的8位alpha通道。 35.簡要說明實現(xiàn)透明效果的過程,并舉例說明。 1. 設(shè)置混合要素D3DRS_SRCBLEND 和 D3DRS_DESTBLEND。 2. 假如你使用alpha部分,指定資源(材質(zhì)或alpha通道)。 3. 允許alpha混合渲染狀態(tài)。 I

38、D3DXMesh* Teapot = 0; // the teapot D3DMATERIAL9 TeapotMtrl; // the teapot’s material IDirect3DVertexBuffer9* BkGndQuad = 0; // background quad - crate IDirect3DTexture9* BkGndTex = 0; // crate texture D3DMATERIAL9 BkGndMtrl; // background material bool Setup() { TeapotMtrl = d3d::RED_MTRL;

39、 TeapotMtrl.Diffuse.a = 0.5f; // set alpha to 50% opacity BkGndMtrl = d3d::WHITE_MTRL; D3DXCreateTeapot(Device, &Teapot, 0); ...// Create background quad snipped ...// Light and texture setup snipped // use alpha in materials diffuse component for alpha Device->SetTextureStageS

40、tate(0, D3DTSS_ALPHAARG1, D3DTA_DIFFUSE); Device->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1); // set blending factors so that alpha // component determines transparency Device->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); Device->SetRenderState(D3DRS_DESTBLEND, D3DBLE

41、ND_INVSRCALPHA); ...// view/projection matrix setup snipped return true; } bool Display(float timeDelta) { if( Device ) { // // Update // // increase/decrease alpha via keyboard input if( ::GetAsyncKeyState(A) & 0x8000f ) TeapotMtrl.Diffuse.a += 0.01f; if( ::GetAs

42、yncKeyState(S) & 0x8000f ) TeapotMtrl.Diffuse.a -= 0.01f; // force alpha to [0, 1] interval if(TeapotMtrl.Diffuse.a > 1.0f) TeapotMtrl.Diffuse.a = 1.0f; if(TeapotMtrl.Diffuse.a < 0.0f) TeapotMtrl.Diffuse.a = 0.0f; // // Render // Device->Clear(0, 0, D3DCLEAR_TARGET |

43、 D3DCLEAR_ZBUFFER, 0xffffffff, 1.0f, 0); Device->BeginScene(); // Draw the background D3DXMATRIX W; D3DXMatrixIdentity(&W); Device->SetTransform(D3DTS_WORLD, &W); Device->SetFVF(Vertex::FVF); Device->SetStreamSource(0, BkGndQuad, 0, sizeof(Vertex)); Device->SetMateri

44、al(&BkGndMtrl); Device->SetTexture(0, BkGndTex); Device->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 2); // Draw the teapot Device->SetRenderState(D3DRS_ALPHABLENDENABLE, true); D3DXMatrixScaling(&W, 1.5f, 1.5f, 1.5f); Device->SetTransform(D3DTS_WORLD, &W); Device->SetMaterial(&Teapo

45、tMtrl); Device->SetTexture(0, 0); Teapot->DrawSubset(0); Device->SetRenderState(D3DRS_ALPHABLENDENABLE, false); Device->EndScene(); Device->Present(0, 0, 0, 0); } return true; } 36.簡要說明模板緩存的作用及其工作原理。 模版緩存是一個遠離屏幕的緩存,模版緩存就象一個模版它允許我們印刷渲染后緩存的某個部分。模版緩存是Direct3D中的一小部分,它是通過一個簡單的表面而被約束

46、的。就象混合,這個簡單的表面提供了可變的強大的設(shè)置能力。 在我們創(chuàng)建深度緩存的同時一個模版緩存能夠被創(chuàng)建。當指定深度緩存格式的時候,我們同時指定模版緩存的格式。這樣,模版緩存和深度緩存分享同一個離屏表面緩存,但是每個像素被指定到各自緩存內(nèi)存片段中 37.在D3D中,如何查詢模板緩存格式? 下面列出了3種深度/模版緩存的格式: l D3DFMT_D24S8—這種格式是說創(chuàng)建一個32位深度/模版緩存,其中24位為深度緩存,8位為模版緩存。 l D3DFMT_D24X4S4—這種格式是說創(chuàng)建一個32位深度/模版緩存,其中24位為深度緩存,4位為模版緩存,還有4位留著不用。 l D3DFM

47、T_D15S1—這種格式是說創(chuàng)建一個16位深度/模版緩存,其中15位為深度緩存,1位為模版緩存。 38.簡要介紹在D3D中模板緩存有什么作用? 我們能夠使用模版緩存來阻止渲染后緩存中的某些部分,通過模板測試來實現(xiàn),模版測試比較LHS和RHS,通過比較運算來指定。全部的運算都得到一個布爾值(true/false)。假如測試的結(jié)果是true,那么我們把像素寫入后緩存。假如測試的結(jié)果是false,我們就阻止像素被寫入后緩存。當然,如果像素不能被寫入后緩存,那么它也不能被寫入深度緩存。 39.在3D環(huán)境下,如何繪制一個3D的字體,一個3D的字體主要包含哪些因素? LOGFONT lf;

48、 ZeroMemory(&lf, sizeof(LOGFONT)); lf.lfHeight = 25; // in logical units lf.lfWidth = 12; // in logical units lf.lfWeight = 500; // boldness, range 0(light) - 1000(bold) lf.lfItalic = false; lf.lfUnderline = false; lf.lfStrikeOut = false; lf.lfCharSet = DEFAULT_CHARSET; strcpy(lf.lfFaceName

49、, "Times New Roman"); // font style ID3DXFont* font = 0; D3DXCreateFontIndirect(Device, &lf, &font); 40.如何計算屏幕上每秒鐘繪制的幀數(shù)? void CalcFPS(float timeDelta) { FrameCnt++; TimeElapsed += timeDelta; if(TimeElapsed >= 1.0f) { FPS = (float)FrameCnt / TimeElapsed; TimeElapsed = 0.0f; Fram

50、eCnt = 0; } } 41.在D3D中,三角形面片如果依據(jù)屬性進行排序,那么具有相同屬性ID的子集具有什么樣的特性? 一個子集(subset)是在mesh中的使用相同屬性渲染的一組三角形。這里的屬性是指材質(zhì),紋理和渲染狀態(tài),在mesh中的每個三角形都與一個屬性ID相關(guān)聯(lián),表示該三角形屬于該子集。 42.D3D中的鄰接數(shù)組的類型是什么?其中每一項的含義是什么?與定點之間的關(guān)系是什么? 鄰接數(shù)組是一個DWORD數(shù)組,其中的每一項對應(yīng)了mesh中的一個三角形。第i項對應(yīng)的三角形由以下三個索引值定義: A = i * 3 B = i * 3 + 1 C = i * 3

51、+ 2 43.請用圖的形式繪出屬性緩存與頂點緩存之間的關(guān)系。 44.請用圖的形式繪出鄰接矩陣與頂點索引之間的關(guān)系。 45.在3D Max中構(gòu)造一個三維立體模型,并請用程序?qū)崿F(xiàn)如下要求: 獲取該模型所有三角面的信息。 獲取該模型中具有同種屬性的點的材質(zhì)及紋理文件的信息。 獲取構(gòu)成該模型的所有點的信息以及點的索引。 在程序中重新繪制該模型。 46.針對題45中的模型,更換其中的紋理文件及材質(zhì)信息,并顯示更換后的模型。 47.對題45中的模型構(gòu)造一個球形及方形的包圍盒,并顯示相應(yīng)的模型。 48.求將攝像機繞任意軸旋轉(zhuǎn)時的旋轉(zhuǎn)矩陣,用數(shù)學(xué)表達式描述出來,并用D3DX函數(shù)實現(xiàn)

52、。 為了實現(xiàn)我們的攝像機旋轉(zhuǎn)方法,我們需要能夠繞著任意軸旋轉(zhuǎn)。D3DX庫提供下面的函數(shù)來解決這個問題: D3DXMATRIX *D3DXMatrixRotationAxis( D3DXMATRIX *pOut, // returns rotation matrix CONST D3DXVECTOR3 *pV, // axis to rotate around FLOAT Angle // angle, in radians, to rotate ); 例如,假如我們想繞向量(0.707, 0.707, 0)軸旋轉(zhuǎn)π/2角度。我們可以這樣寫: D3DXMATRIX R;

53、D3DXVECTOR3 axis(0.707f, 0.707f, 0.0f); D3DXMatrixRotationAxis(&R, &axis, D3DX_PI / 2.0f); 49.求將攝像機從當前位置Pos(x0,y0,z0)移動到p’(x1,y1,z1)的平移矩陣。 50.試編程用兩種不同的方法來構(gòu)造一個3D地形。 51.如何控制攝像機在地形行走過程中不至于穿透地形而始終在地形上面行走? float Terrain::getHeight(float x, float z) { // Translate on xz-p

54、lane by the transformation that takes // the terrain START point to the origin. x = ((float) width / 2.0f) + x; z = ((float) depth / 2.0f) - z; // Scale down by the transformation that makes the // cellspacing equal to one. This is given by // 1 / cellspacing si

55、nce cellspacing * 1 / cellspacing = 1. x /= (float) cellSpacing; z /= (float)_cellSpacing; float col = ::floorf(x); float row = ::floorf(z); float A = getHeightmapEntry(row, col); float B = getHeightmapEntry(row, col+1); float C = getHeightmapEntry(row+1, col); float

56、D = getHeightmapEntry(row+1, col+1); float dx = x - col; float dz = z - row; if(dz < 1.0f - dx) // upper triangle ABC { float uy = B - A; // A->B float vy = C - A; // A->C height = A + d3d::Lerp(0.0f, uy, dx) + d3d::Lerp(0.0f, vy, d

57、z) ; } else // lower triangle DCB { float uy = C - D; // D->C float vy = B - D; // D->B height = D + d3d::Lerp(0.0f, uy, 1.0f - dx) + d3d::Lerp(0.0f, vy, 1.0f - dz); } return height; } 52.繪制一個粒子系統(tǒng)時,每一幀應(yīng)該做哪些操作? 每

58、一幀里執(zhí)行: A. 更新所有粒子。 B. COPY所有活著的粒子到頂點緩存。 C. 繪制頂點緩存。 53.試編寫程序?qū)崿F(xiàn)霧化效果。 // File: fog.txt // Desc: Effect file that handles device states for linear vertex fog. technique Fog { pass P0 { // Set misc render states. pixelshader = null; vertexshader

59、 = null; fvf = XYZ | Normal; Lighting = true; NormalizeNormals = true; SpecularEnable = false; // Fog states FogVertexMode = LINEAR; // Linear fog function. FogStart = 50.0f; // Fog starts 50 units away from viewpoint. FogEnd = 300.0f; // Fog ends 300 units away from viewpoint. FogColor = 0x00CCCCCC; // Gray colored fog. FogEnable = true; // Enable vertex fog. } }

展開閱讀全文
溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

相關(guān)資源

更多
正為您匹配相似的精品文檔
關(guān)于我們 - 網(wǎng)站聲明 - 網(wǎng)站地圖 - 資源地圖 - 友情鏈接 - 網(wǎng)站客服 - 聯(lián)系我們

copyright@ 2023-2025  zhuangpeitu.com 裝配圖網(wǎng)版權(quán)所有   聯(lián)系電話:18123376007

備案號:ICP2024067431-1 川公網(wǎng)安備51140202000466號


本站為文檔C2C交易模式,即用戶上傳的文檔直接被用戶下載,本站只是中間服務(wù)平臺,本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權(quán)或隱私,請立即通知裝配圖網(wǎng),我們立即給予刪除!