使用mesh渲染複雜模型(呼叫 x 檔案)

2021-03-31 08:56:31 字數 2256 閱讀 1493

前面我們學了使用簡單的類庫中的mesh建立了乙個茶壺,但在實際操作中,我們的模型恐怕不只是茶壺這麼簡單吧?

其實有很多複雜3d模型是通過建模軟體製作的,如3dmax等。d3d支援.x模型檔案,.x檔案包括模型資料,如vertexbuffer

,indexbuffer,以及材質等資訊。而且材質資訊還可能包括紋理等資訊,在獲取這些檔案的同時,你也同時可以獲得high

level shader language(hlsl)檔案(hlsl是個高階話題,還沒學,以後說明吧)。通過使用建模軟體生成的.x檔案,使我們

的3d程式設計變得更簡單,更容易。下面說明怎樣簡單load乙個.x檔案.

1.首先,先介紹呼叫.x檔案的最簡單的靜態方法:

mesh.fromfile(string filename,microsoft.directx.direct3d.meshflags options ,

,microsoft.directx.direct3d.device device ,out microsoft.directx.direct3d.extendedmaterial materials )

引數明說:

filename:是指.x檔案的路徑

options:是meshflags,用來指定讀入的資料放到哪兒,怎樣放。如:meshflags.dynamic 是指對indexbuffer和vertexbuffer使用usage.dynamic

和usage.dynamic 。還有很多meshflags,請參見msdn.

deivce:不多說了吧。

materials:這是乙個輸出的陣列,包含材質資訊。

下面我們編乙個loadmesh(string filename)的方法。filename當然是想要load的.x檔案的路徑

private void loadmesh(string file)

{extendedmaterial mtrl;

mesh=mesh.fromfile(file,meshflags.managed,device,out mtrl);

if((mtrl!=null)&&(mtrl.length>0))

{meshmaterials=new material[mtrl.length];     //事先建立的material陣列,用於存放從.x檔案中讀入的材質資訊

meshtextures=new texture[mtrl.length];       //事先建立的texture陣列,用於存放從.x檔案中讀入的紋理資訊

for(int i=0;i在方法中,整體思路是上,先呼叫構造方法load .x檔案,然後判斷輸入的extendedmaterial陣列。如果有資料存在,則

分別把資料存放到事先定義的material陣列中和texture陣列中。由於texture資料不一定存在,所以單獨判斷一次。

通過上面方法。我們的.x檔案中的材質,頂點,紋理資訊就被提取出來了。下面可以渲染了。

2.剛才提取了紋理資訊,材質資訊到兩個陣列,下面當然是讓裝置知道是什麼樣的材質和紋理資訊了.

對於每乙個紋理和材質:

for(int i=0;i通過上面的處理,影象就可以顯示出來了,但是,你必須加上燈光,才能看清楚喔 。加燈光:

device.lights[0].diffuse=system.drawing.color.white;

device.lights[0].enabled=true;

device.lights[0].direction=new vector3(0.0f,1.0f,0.0f);//以原點為起點

device.lights[0].type=lighttype.directional;

上面只是介紹了。當然得在程式中呼叫這些方法,首選在device被例項化的後面,呼叫loadmesh方法,在渲染時,在

你的渲染方法中加入上面的for語句那個快,就行了。還有,一定要根據實際情況設定檢視矩陣和projection矩陣。

對於我的例子,我是呼叫的sdk中的tiny.x 。我用的檢視和projection矩陣如下:

device.transform.view=matrix.lookatlh(new vector3(0.0f,-1000.0f,200.0f),new vector3(0.0f,0.0f,0.0f),new vector3(0.0f,1.0f,0.0f));

device.transform.projection=matrix.perspectivefovlh((float)math.pi/4.0f,this.width/this.height,1.0f,10000.0f);

收工!不知道我的敘述正確否??不正確請指正。

基於物理的渲染 迪士尼的渲染模型

今天給大家介紹的是一篇關於基於物理渲染 physically based rendering 的技術 該篇 是在2012年siggraph圖形大會上,由迪士尼公司分享的關於pbr技術的報告。pbr是最近遊戲渲染領域中比較高階的渲染管線。相比於傳統基於lambert以及phong模型的渲染管線,pbr...

Unity使用Mesh元件畫圓環

呼叫 畫圓環 依附物件 中心點 分割段數 內徑 厚度,向外擴的寬度 材質 public static void drawring gameobject gameobject,vector3 center,int segments,float innerradius,float thickness,m...

Vue笨蛋學原理 渲染模型

這不是vue的原始碼 這不是vue的原始碼 這不是vue的原始碼 只是為了幫助咱們去理解vue的思想 把el掛載到vue例項上 render函式生成虛擬dom 虛擬dom和資料結合渲染到頁面上 資料一旦改變,立即生成新的虛擬dom,新的虛擬dom去和舊的虛擬dom比較 更新頁面 function m...