人機(jī)交互習(xí)題講解.doc
《人機(jī)交互習(xí)題講解.doc》由會員分享,可在線閱讀,更多相關(guān)《人機(jī)交互習(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ù)乘、點(diǎn)積、叉積運(yùn)算方法,并用簡單的程序?qū)崿F(xiàn)上述運(yù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.已知平面的一個點(diǎn)P0以及垂直于該平面的一條法向矢量n,請表示出該平面,并采用適當(dāng)?shù)某绦騽?chuàng)建該平面。 該平面為p點(diǎn)的集合,n*(p-p0)=0; 這里a, b和c是平面法向量n的成員,d就是那個常數(shù)。 8.如何判斷一個點(diǎn)是否在某個平面上? 例如,假設(shè)平面(n, d),我們能判定點(diǎn)p和平面的關(guān)系: 假如np + d = 0,那么點(diǎn)p與平面共面。 假如np + d >0,那么點(diǎn)p在平面的前面且在平面的正半空間里。 假如np + d <0,那么點(diǎn)p在平面的背面且在平面的負(fù)半空間里。 9.編寫簡短程序判斷某
8、計算機(jī)是否支持頂點(diǎn)和像素著色。 bool supportsHardwareVertexProcessing; // 如果為真,意味著硬件設(shè)備支持它 if( caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT ) { // 支持 supportsHardwareVertexProcessing = true;} Else { // 不支持 hardwareSupportsVertexProcessing = false;} 10.在D3D中表面的含義是什么?用什么來描述表面?編寫程序?qū)⒈砻娲鎯^(qū)中的每個像素設(shè)置為藍(lán)色。 表面是一個像素點(diǎn)陣,
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表示沒有指定鎖定標(biāo)記 // 遍例表面上的每個像素,將它們設(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è)為藍(lán)色 } } 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位分配給藍(lán)色。 D3DFM
13、T_X8R8G8B8——表示一個32位像素,從左開始,8位不用,8位分配給紅色,8位分配給綠色,8位分配給藍(lán)色。 D3DFMT_A8R8G8B8——表示一個32位像素,從左開始,8位為ALPHA通道,8位分配給紅色,8位分配給綠色,8位分配給藍(lán)色。 D3DFMT_A16B16G16R16F——表示一個64位浮點(diǎn)像素,從左開始,16位為ALPHA通道,16位分配給藍(lán)色,16位分配給綠色,16位分配給紅色。 D3DFMT_A32B32G32R32F——表示一個128位浮點(diǎn)像素,從左開始,32位為ALPHA通道,32位分配給藍(lán)色,32位分配給綠色,32位分配給紅色。 13.內(nèi)存、顯存以及AG
14、P存儲區(qū)有何區(qū)別? 在程序中讀取顯存和AGP內(nèi)存都是非常慢的。因此,假如你在運(yùn)行時需要讀取你的幾何物體,最好的方案是指定一塊系統(tǒng)內(nèi)存,都在其中拷貝并且讀取數(shù)據(jù) 14.深度緩存有什么作用,他存儲了什么信息? 深度緩沖也是一個表面,但它不是用來存儲圖像數(shù)據(jù)的,而是用來記錄像素的深度信息。它將確定哪一個像素最后被繪制出來。深度緩沖為每一個像素計算深度值,并進(jìn)行深度測試。通過深度測試,我們可以比較出哪個像素離照相機(jī)更近,并將它畫出來。這樣就可以只繪制最靠近照相機(jī)的像素,被遮住的像素就不會被畫出來。 15.如何檢測某顯示卡是否支持硬件頂點(diǎn)運(yùn)算? bool supportsHardwareVer
15、texProcessing; // 如果為真,意味著硬件設(shè)備支持它 if( caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT ) {// 支持 supportsHardwareVertexProcessing = true;} else{// 不支持 hardwareSupportsVertexProcessing = false;} 16.如何實(shí)現(xiàn)Direct3D的初始化,需要完成哪些工作? 根據(jù)下邊的步驟你能初始化Direct3D: 1. 獲得一個IDirect3D9接口指針。這個接口用于獲得物理設(shè)備的信息和創(chuàng)建一個IDirect3D
16、Device9接口,它是一個代表我們顯示3D圖形的物理設(shè)備的C++對象。 2. 檢查設(shè)備能力(D3DCAPS9),搞清楚主顯卡是否支持硬件頂點(diǎn)處理。我們需要知道假如它能支持,我們就能創(chuàng)建IDirect3DDevice9接口。 3. 初始化一個D3DPRESENT_PARAMETERS結(jié)構(gòu)實(shí)例,這個結(jié)構(gòu)包含了許多數(shù)據(jù)成員允許我們指定將要創(chuàng)建的IDirect3DDevice9接口的特性。 4. 創(chuàng)建一個基于已經(jīng)初始化好的D3DPRESENT_PARAMETERS結(jié)構(gòu)的IDirect3DDevice9對象。它是一個代表我們顯示3D圖形的物理設(shè)備的C++對象。 17.在D3D中頂點(diǎn)如何表示,并
17、舉例說明。 struct ColorVertex { float _x, _y, _z; // 位置 DWORD _color; // 顏色}; struct NormalTexVertex { float _x, _y, _z; // 位置 float _nx, _ny, _nz; // 法線向量 float _u, _v; // 紋理坐標(biāo)}; 18.在D3D中頂點(diǎn)索引如何表示,并舉例說明。 我們創(chuàng)建一個頂點(diǎn)列表和一個索引列表(index list)。頂點(diǎn)列表包含所有不重復(fù)的頂點(diǎn),索引列中則用頂點(diǎn)列中定義的值來表示每一個三角形的構(gòu)造方式?;氐侥莻€矩形的示例上來,它
18、的頂點(diǎn)列表的構(gòu)造方式如下: Vertex vertexList[4] = {v0, v1, v2, v3}; 索引列表則定義頂點(diǎn)列中的頂點(diǎn)是如何構(gòu)造這兩個三角形的: WORD indexList[6] = {0, 1, 2, //三角形0 0, 2, 3}; //三角形1 也就是說,用頂點(diǎn)列表中的0(vertexList[0])、1(vertexList[1])和2(vertexList[2])頂點(diǎn)構(gòu)成三角形0;用頂點(diǎn)列表中的0(vertexList[0])、2(vertexList[2])和3(vertexList[3])頂點(diǎn)構(gòu)成三角形1。 19.請簡要說明攝像擺
19、放的位置和方向,裁剪面的大小對觀察3D場景中的物體有何影響? 20.物體局部坐標(biāo)系在游戲設(shè)計中有何用處? 為什么有了全局坐標(biāo)系后還需要有世界坐標(biāo)系和觀察坐標(biāo)系? 自身坐標(biāo)系簡化了建模的過程。在物體自己的坐標(biāo)系中建模比在世界坐標(biāo)系中直接建模更容易。例如,在自身坐標(biāo)系中建模不像在世界坐標(biāo)系中要考慮本物體相對于其他物體的位置、大小、方向關(guān)系。 我們需要把它們都放到同一個世界坐標(biāo)系中,世界變換通常是用平移、旋轉(zhuǎn)、縮放操作來設(shè)置模型在世界坐標(biāo)系中的位置、大小、方向。世界變換就是通過各物體在世界坐標(biāo)系中的位置、大小和方向等相互之間的關(guān)系來建立所有物體。 在世界坐標(biāo)系中當(dāng)照相機(jī)是
20、任意放置和定向時,投影和其它一些操作會變得困難或低效。為了使事情變得更簡單,我們將照相機(jī)平移變換到世界坐標(biāo)系的源點(diǎn)并把它的方向旋轉(zhuǎn)至朝向Z軸的正方向。 21.編寫簡單程序?qū)崿F(xiàn)將局部坐標(biāo)系轉(zhuǎn)換成世界坐標(biāo)系,以及如何將世界坐標(biāo)系轉(zhuǎn)換成觀察坐標(biāo)系. //創(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, // 照相機(jī)在世界坐標(biāo)系的位置 CONST D3DXVECTOR3* pAt, // 照相機(jī)在世界坐標(biāo)系的目標(biāo)點(diǎn) CONST D3DXVECTOR3* pUp // 世界坐標(biāo)系的上方向(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)建一個頂點(diǎn)緩存和一個索引緩存,在對相應(yīng)的緩存進(jìn)行讀寫操作前必須首先做什么? 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方法。當(dāng)我們訪問完緩存后必須對它解鎖。一旦有一個指向內(nèi)存的指針,我們就能對它進(jìn)行讀寫。 24.如何使用頂點(diǎn)緩存和索引緩存繪制相應(yīng)的物體,繪制前必須首先完成什么工作? 1、 設(shè)置資源流。設(shè)置資源流與一個頂點(diǎn)緩存掛鉤,此流就是
26、一個流入渲染管線的幾何信息的流。 下面的方法是用于設(shè)置一個資源流: HRESULT IDirect3DDevice9::SetStreamSource( UINT StreamNumber, IDirect3DVertexBuffer9* pStreamData, UINT OffsetInBytes, UINT Stride ); 2、設(shè)置頂點(diǎn)格式。在這里我們指定后面用來繪圖調(diào)用的頂點(diǎn)的頂點(diǎn)格式。 _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 點(diǎn)光源——這種光源在世界坐標(biāo)中有一個位置且向所有方向上都照射光線。 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——用一個向量來描述的光源世界坐標(biāo)位置。這個值對于燈光的方向是無意義的。 l Direction——用一個向量來描述的光源世界坐標(biāo)照射方向。這個值不能用在點(diǎn)光源上。 l Range——燈光能夠傳播的最大范圍。這個值不能比大。且不
32、能用于方向光源。 l Falloff——這個值只能用在聚光燈上。它定義燈光在從內(nèi)圓錐到外圓錐之間的強(qiáng)度衰減。它的值通常設(shè)置為1.0f。 l Attenuation0, Attenuation1, Attenuation2——這些衰減變量被用來定義燈光強(qiáng)度的傳播距離衰減。它們只被用于點(diǎn)光源和聚光燈上。Attenuation0定義恒定衰減,Attenuation1定義線性衰減,Attenuation2定義二次衰減。適當(dāng)?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ù)通常是從存儲在磁盤中的圖片文件中讀取的,且被讀進(jìn)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)建一個多級漸進(jìn)紋理? 由某一紋理創(chuàng)建一系列分辨率逐漸減小的紋理圖像,并且對每種分辨率下的紋理所采用的過濾方式進(jìn)行定制,以便保存那些較重要的細(xì)節(jié)。 32.如何對2個像素之進(jìn)行融合處理?融合的目的是什么? 面的公式是用來混合兩個像素值的: 上面的所有變量都是一個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)的一個值。它指定目的像素在混合中的百分比。 源和目的混合要素使我們能夠按照多種途徑改變原始源和目的像素,允許實(shí)現(xiàn)不同的效果。 33.簡要討論融合因子對融合效果的影響。 通過設(shè)置不同的融合因子,我們能夠創(chuàng)造很多不同的混合效果。 34.試采用兩種不同的方法創(chuàng)建Alpah通道。 Alpha部分主要是用來指定像素的透明等級,Alph
37、a通道是額外的設(shè)置位,用它來保存每一個點(diǎn)的alpha值。1使用DirectX紋理工具來創(chuàng)建一個帶alpha通道的DDS文件,DDS文件能夠利用D3DXCreateTextureFromFile被讀進(jìn)紋理中,就象bmp和jpg文件一樣,圖像自動的按照24位RGB紋理被讀取,我們需要將該紋理增加為32位ARGB紋理,增加的是額外的8位alpha通道。 35.簡要說明實(shí)現(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.簡要說明模板緩存的作用及其工作原理。 模版緩存是一個遠(yuǎn)離屏幕的緩存,模版緩存就象一個模版它允許我們印刷渲染后緩存的某個部分。模版緩存是Direct3D中的一小部分,它是通過一個簡單的表面而被約束
46、的。就象混合,這個簡單的表面提供了可變的強(qiáng)大的設(shè)置能力。 在我們創(chuàng)建深度緩存的同時一個模版緩存能夠被創(chuàng)建。當(dā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中模板緩存有什么作用? 我們能夠使用模版緩存來阻止渲染后緩存中的某些部分,通過模板測試來實(shí)現(xiàn),模版測試比較LHS和RHS,通過比較運(yùn)算來指定。全部的運(yùn)算都得到一個布爾值(true/false)。假如測試的結(jié)果是true,那么我們把像素寫入后緩存。假如測試的結(jié)果是false,我們就阻止像素被寫入后緩存。當(dāng)然,如果像素不能被寫入后緩存,那么它也不能被寫入深度緩存。 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ù)屬性進(jìn)行排序,那么具有相同屬性ID的子集具有什么樣的特性? 一個子集(subset)是在mesh中的使用相同屬性渲染的一組三角形。這里的屬性是指材質(zhì),紋理和渲染狀態(tài),在mesh中的每個三角形都與一個屬性ID相關(guān)聯(lián),表示該三角形屬于該子集。 42.D3D中的鄰接數(shù)組的類型是什么?其中每一項的含義是什么?與定點(diǎn)之間的關(guān)系是什么? 鄰接數(shù)組是一個DWORD數(shù)組,其中的每一項對應(yīng)了mesh中的一個三角形。第i項對應(yīng)的三角形由以下三個索引值定義: A = i * 3 B = i * 3 + 1 C = i * 3
51、+ 2 43.請用圖的形式繪出屬性緩存與頂點(diǎn)緩存之間的關(guān)系。 44.請用圖的形式繪出鄰接矩陣與頂點(diǎn)索引之間的關(guān)系。 45.在3D Max中構(gòu)造一個三維立體模型,并請用程序?qū)崿F(xiàn)如下要求: 獲取該模型所有三角面的信息。 獲取該模型中具有同種屬性的點(diǎn)的材質(zhì)及紋理文件的信息。 獲取構(gòu)成該模型的所有點(diǎn)的信息以及點(diǎn)的索引。 在程序中重新繪制該模型。 46.針對題45中的模型,更換其中的紋理文件及材質(zhì)信息,并顯示更換后的模型。 47.對題45中的模型構(gòu)造一個球形及方形的包圍盒,并顯示相應(yīng)的模型。 48.求將攝像機(jī)繞任意軸旋轉(zhuǎn)時的旋轉(zhuǎn)矩陣,用數(shù)學(xué)表達(dá)式描述出來,并用D3DX函數(shù)實(shí)現(xiàn)
52、。 為了實(shí)現(xiàn)我們的攝像機(jī)旋轉(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.求將攝像機(jī)從當(dāng)前位置Pos(x0,y0,z0)移動到p’(x1,y1,z1)的平移矩陣。 50.試編程用兩種不同的方法來構(gòu)造一個3D地形。 51.如何控制攝像機(jī)在地形行走過程中不至于穿透地形而始終在地形上面行走? 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所有活著的粒子到頂點(diǎn)緩存。 C. 繪制頂點(diǎn)緩存。 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 6.煤礦安全生產(chǎn)科普知識競賽題含答案
- 2.煤礦爆破工技能鑒定試題含答案
- 3.爆破工培訓(xùn)考試試題含答案
- 2.煤礦安全監(jiān)察人員模擬考試題庫試卷含答案
- 3.金屬非金屬礦山安全管理人員(地下礦山)安全生產(chǎn)模擬考試題庫試卷含答案
- 4.煤礦特種作業(yè)人員井下電鉗工模擬考試題庫試卷含答案
- 1 煤礦安全生產(chǎn)及管理知識測試題庫及答案
- 2 各種煤礦安全考試試題含答案
- 1 煤礦安全檢查考試題
- 1 井下放炮員練習(xí)題含答案
- 2煤礦安全監(jiān)測工種技術(shù)比武題庫含解析
- 1 礦山應(yīng)急救援安全知識競賽試題
- 1 礦井泵工考試練習(xí)題含答案
- 2煤礦爆破工考試復(fù)習(xí)題含答案
- 1 各種煤礦安全考試試題含答案