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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

DirectxMeshes

發布時間:2023/12/13 综合教程 32 生活家
生活随笔 收集整理的這篇文章主要介紹了 DirectxMeshes 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前面已經介紹過ID3DXMesh接口了, 但是只是簡單的用了D3DXCreate 來創建簡單的幾何體。這篇文章詳細地介紹ID3DXMesh接口。

1. Geometry Info

ID3DXMesh 是從ID3DXBaseMesh繼承下來的。ID3DXBaseMesh包含了vertex buffer 和 index buffer。通過這兩者的組合我們可以畫出任意三角形及任意三角形的組合。我們可以使用如下方式把vertex buffer 和 index buffer從ID3DXBaseMesh提取出來。

HRESULT ID3DXMesh::GetVertexBuffer(LPDIRECT3DVERTEXBUFFER9* vertexBuf);

HRESULT ID3DXMesh::GeIndexBuffer(LPDIRECT3DindexBUFFER9* indexBuf);

ID3DXMesh 自己也定義了一套方法:

(1). GetFVF(): 返回頂點的FVF

(2). GetNumVertices(): 返回有多少個頂點。

(3). GetNumBytesPreVertex(): 返回每個頂點有多少字節

(4). GetNumFaces(): 返回有多少個三角形。

2. .x File

在3D圖形學中,網格是由一系列共面的多邊形組成。在Direct3D中, 提供了好幾個接口來處理網格,其中最常見的一個就是ID3DXMesh.我們可以使用該接口來裝載網格數據,獲得網格的各種信息.

一架飛機,一個花瓶,這樣的實體就叫做模型,而生成這種模型的過程叫建模。Direct3D利用.x文件來保存模型。

3. 顯示一個模型

顯示一個.x 文件,其實很簡單: 導入.x 文件, 得到.x文件中關于Material 和 Texture的信息, 然后利用這些信息渲染物體。

I: 首先聲明幾個渲染需要的變量:網格, 材質, 紋理


1 ID3DXMesh*                      Mesh = 0; 
2 std::vector<D3DMATERIAL9> Mtrls(0);
3 std::vector<IDirect3DTexture9*> Textures(0);


II. 然后導入一個.x 文件。 可以利用D3DXLoadMeshFromX接口, 得到Mesh


 1 HRESULT hr = 0;
2
3 // Load the XFile data.
4 ID3DXBuffer* adjBuffer = 0;
5 ID3DXBuffer* mtrlBuffer = 0;
6 DWORD numMtrls = 0;
7 hr = D3DXLoadMeshFromX(
8 _T("bigship1.x"),
9 D3DXMESH_MANAGED,
10 Device,
11 &adjBuffer,
12 &mtrlBuffer,
13 0,
14 &numMtrls,
15 &Mesh);

III: 利用上得出的東西, 設置好Material 和 Texture


 1 if( mtrlBuffer != 0 && numMtrls != 0 ) 
2 {
3 D3DXMATERIAL* mtrls = (D3DXMATERIAL*)mtrlBuffer->GetBufferPointer();
4 for(int i = 0; i < numMtrls; i++)
5 {
6 // the MatD3D property doesn't have an ambient value set
7 // when its loaded, so set it now:
8 mtrls[i].MatD3D.Ambient = mtrls[i].MatD3D.Diffuse;
9 // save the ith material
10 Mtrls.push_back( mtrls[i].MatD3D );
11 // check if the ith material has an associative texture
12 if( mtrls[i].pTextureFilename != 0 )
13 {
14 // yes, load the texture for the ith subset
15 IDirect3DTexture9* tex = 0;
16 LPCWSTR lpTmp = 0;
17 lpTmp = ConvetASCIIToUnicode(mtrls[i].pTextureFilename);
18 D3DXCreateTextureFromFile(
19 Device,
20 lpTmp,
21 &tex);
22 // save the loaded texture
23 Textures.push_back( tex );
24 }
25 else
26 {
27 // no texture for the ith subset
28 Textures.push_back( 0 );
29 }
30 }
31

IIII: 設置好做不系,攝像頭,渲染參數等之后就可以顯示模型了


for(int i = 0; i < Mtrls.size(); i++) 
{
Device->SetMaterial( &Mtrls[i] );
Device->SetTexture(0, Textures[i]);
Mesh->DrawSubset(i);
}

總結

以上是生活随笔為你收集整理的DirectxMeshes的全部內容,希望文章能夠幫你解決所遇到的問題。

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