日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

《DirectX 9.0 3D游戏开发编程基础》 第二章 绘制流水线 读书笔记

發布時間:2023/12/10 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《DirectX 9.0 3D游戏开发编程基础》 第二章 绘制流水线 读书笔记 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

模型的表示

場景:物品或模型的集合

任何物品都可以用三角形網絡逼近表示。我們經常用以下術語描述三角形網絡:多邊形(polygons)、圖元(primitives)、網絡幾何單元(mesh geometry)。

描述三角形:指定三個頂點

描述物品:三角形單元列表

頂點格式

可以創建我們所希望包含的頂點信息,如位置,顏色等,如下所示

Code Snippet
  • struct ColorVertex{
  • ????float _x,_y,_z;
  • ????DWORD color;
  • };
  • struct NormalTexVertex{
  • ????float _x,_y,_z;
  • ????float _nx,_ny,_nz;
  • ????float _u,_v;
  • };
  • 頂點結構定義好之后,就需要用靈活頂點格式(FVF)標記組合來描述頂點的組織結構。如下所示

    #define FVF_COLOR (D3DFVF_XYZ | DEDFVF_DIFFUSE)? //包含了位置信息和漫反射信息

    #define FVF_NORMAL_TEX (D3DFVF_XYZ | D3dFVF_NORMAL | D3DFVF_TEX1) //包含了位置、法線、紋理坐標。

    靈活頂點格式約定:標記指定順序與頂點結構中相應類型數據保持一致

    三角形單元

    三角形單元包含了我們所希望繪制的每個獨立三角形的數據。如下圖所示產,并指定每個三角形單元的頂點。

    Vertex rect[6] = {v0,v1,v2,v0,v2,v3}

    索引

    原理:頂點列表包含了全部獨立的頂點,索引包含了指向頂點列表的索引,這些索引規定了為構建三角形單元,各頂點應按何種方式來組織。上圖中的例子可以這樣創建

    Vertex vertexList[4] = {v0,v1,v2,v3}

    WORD indexList[6] = {0,1,2,0,2,3} //其中0,1,2 都上vertexlist的下標。

    虛擬攝像機

    那些位于視域體之外的物品是不可見的,在進一步處理時就應將其丟棄。丟棄這類數據運算過程稱為裁剪。

    繪制流水線

    定義:建立了3d場景的幾何描述,并設置好虛擬攝像機,我們下面的任務就是在顯示器中建立該場景的2d表示。為了實現這一目標實施的一系列去算統稱為繪制流水線

    DirectX坐標變換:IDirect3DDevice9->SetTransform(變換類型,變換矩陣)。例如為了實現自局部坐標系到世界坐標系的變換,我們可以這樣寫

    Device->SetTransform(D3DTS_WORD, & worldMatrix)

    局部坐標系:、

    定義:用于定義構成物品三角形列表的坐標系。如下圖是在自身坐標系中定義的茶壺

    世界坐標系

    位于局部坐標系中的物品通過一個稱為世界變換的去算過程到世界坐標系。通常包括平移、旋轉等。

    假如我們想讓一個立方體位于世界坐標系中的點(-3,2,6)上,讓一個球體位于(5,2,-1) 上,可以如下實現

    Code Snippet
  • D3DMATRIX cubeWorldMatrix;
  • D3DXMatrixTranslation(&cubeWorldMatrix,-3.0f,2.0f,6.0f);
  • D3DXMATRIX sphereWorldMatrix;
  • D3DXMatrixTranslation(&sphereWorldMatrix,5,0f,0.0f,-2.0f);
  • ?
  • //set the cub's transformation
  • Device->SetTransform(D3DTS_WORLD,&cubeWorldMatrix);
  • drawCube();
  • ?
  • Device->SetTransform(D3DTS_WORLD,&sphereWorldMatrix);
  • drawSphere();
  • 觀察坐標系

    為簡化運算將攝像機變換至至世界坐標系原點,并使其光陣與z軸同向。同時空間中的所有幾何體都隨著攝像機一同進行變換,以保證攝像機視場恒定? 。這種變換稱為取景變換。我們稱變換后的幾何體位于觀察坐標系中。

    取景變換矩陣可以用如下函數得到

    ?

    假如攝像機們于(5,3,10),其觀察點為世界坐標系原點。我們可以這樣創建取景變換矩陣

    Code Snippet
  • D3DXVECTOR3 position(5.0f,3.0f,-10.0f);
  • D3DXVECTOR3 targetPoint(0.0f,0.0f,0.0f);
  • D3DXVECTOR3 worldUp(0.0f,1.0f,0.0f);
  • D3DXMATRIX V;
  • D3DXMatrixLookAtLH(&V,&position,&targetPoint,&worldUp);
  • 取景變換需要用IDirect3DDevice9:: SetTransform來設定,其中用于變換的類參數需要指定為D3DTS_VIEW;

    Device->SetTransform(D3DTS_VIEW,&V)

    背面消隱

    通俗來講就是看不見物體的背面,我們將背面加以剔除,這稱為背面消隱。

    哪些是背面朝向:默認狀態下Dirct3d認為頂點順時針(觀察坐標系中)的三角形單元是正面朝向的。頂點排列順序為逆時針的是背面朝向的

    如果某些原因導致背面消隱方式不能滿足應用要求,我們可以修改繪制狀態來達到目的

    Devoce->SetRenderState(D3DRS_CULLMODE,Value)

    其中 Value可取以下值:D3DCULL_NONE 完全禁用背面消隱。 D3DCULL_CW 只用順時針繞序的三角形進行消隱。 D3DCULL_CCW 默認值。

    光照
    裁剪

    投影

    觀察坐標系中我們的任務是獲取3d場景的2d表示。從n維變為n-1維的過程稱為投影。實現投影有多多種方式 ,我們只對其中一種感興趣,即透視投影。透視投影會產生“透視縮短”的效果,即近大遠小。我們將使用以下函數其功能是依據視域體的描述信息創建一個投影矩陣。

    視口變換

    定義:將頂點坐標從投影窗口投影窗口轉換到屏幕的一個矩形區域中。

    光柵化

    為了繪制每一個三形單元 ,如何計算構成三角形單元的每個像素的顏色值。

    總結

    以上是生活随笔為你收集整理的《DirectX 9.0 3D游戏开发编程基础》 第二章 绘制流水线 读书笔记的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。