第八回:紋理人們總是容易忽略身邊的一些事情,越是熟悉、越是親密就越會發生,為什麼呢?我也不知道,不過既然已經發生了,也就沒有必要再去埋怨什麼。金點時空 2000/8/18立刻採取實際的行動,那才是我們唯一應該做的事情!
什麼是紋理?紋理就是我們通常說的貼圖(又叫蒙皮)。其原理就是在3d的模型上面覆蓋上2d的,讓我們的3d模型顯得更真實。看下面的兩張,左邊的是沒有貼圖的老虎模型,右邊是貼了圖的,很明顯,貼了圖的看上去更真實一些。
令人高興的是,d3d已經為我們提供了很方便的紋理功能,不過在實際動手之前,我們先來了解幾個關於紋理的重要概念。
一、紋理尺寸
紋理都是2d的,它可以儲存為bmp、tga、jpg或是任何一種常見的格式,所以它肯定有大小。雖然理論上現在的新型顯示卡可以支援任意尺寸的紋理,不過為了相容以前的顯示卡也為了程式的執行效率,你最好把紋理的尺寸做成2的n次方。如:16 x 16, 32 x 32, 64 x 64, 128 x 128, 256 x 256等等。
二、紋理座標
紋理座標又叫貼圖座標,在d3d中用兩個0到1的浮點值(u,v)來設定乙個點的紋理座標,u是橫軸、v是縱軸。紋理的左上角為(0,0),右下角為(1,1)。下面這張圖很清楚的說明了紋理座標的定義。
如果乙個3d模型有貼圖,那麼就要為模型上的每個點指定一對紋理座標(u,v),作用是標明該點在貼圖中的位置。
好,下面就來說具體的貼圖過程。
(1) 首先,我們要把頂點的格式和fvf設定成下面的樣子。
// 自定義頂點結構
struct customvertex;
// 我們自定義的fvf,定義了頂點的結構,
// d3dfvf_xyz : 表示頂點座標
// d3dfvf_diffuse : 表示頂點的顏色
// d3dfvf_tex1 : 表示有紋理
#define d3dfvf_customvertex (d3dfvf_xyz|d3dfvf_diffuse|d3dfvf_tex1)
(2) 接著是定義和建立紋理,紋理在d3d中使用idirect3dtexture8介面定義:
lpdirect3dtexture8 g_ptexture = null; // 紋理
// 從乙個檔案建立我們的紋理
d3dxcreatetexturefromfile( g_pd3ddevice, "3dgame.bmp", &g_ptexture ) );
(3) 最後在渲染模型之前設定我們剛建立好的紋理就可以了:
// 指定紋理
g_pd3ddevice->settexture( 0, g_ptexture );
g_pd3ddevice->settexturestagestate(0, d3dtss_colorop, d3dtop_selectarg1 );
說明一下這次的例子,這次的例子是基於上一回例子的,我們在上一回生成的圓桶上貼上一張紋理,就是下面的這張。
執行程式,執行的結果立刻出來了,如下:
大致上紋理就是這樣的,基本的原理了解後,一定要下來仔細閱讀我們的例子程式,因為很多細節的東西都包含在程式中了,慢慢理解吧。
啊~~~~,時間也不早了。今天練了一下午的結他,真累啊,睡覺吧。
主頁:郵件:[email protected]
soft於2002-8-17晚
返回
www.gpgame.net
3D遊戲從頭編 第四回 頂點渲染
金點時空 第四回 頂點渲染這個週末有朋友過來成都玩,一群人去春熙路的紅帽象玩跳舞機,好久沒有運動,累得沒力氣,導致本週的文章沒有在週末完成。不過還好,睡了一覺後精神又恢復了,以後一定要加強鍛鍊。這一回我們來說說 中最基礎的東西 頂點渲染,這個東西就和 遊戲中的畫點是乙個道理,重要性就不多說了,乙個字...
3D遊戲從頭編 第七回 燈光
金點時空 第七回 燈光可能秋天就要到了,最近天氣總是突冷忽熱的,一不小心就要著涼。雖然我已經很注意了,但還是沒能逃過這一劫,幸好吃藥吃的及時 到位,再加上 的悉心照料,終於是挺了過來。再說點題外話,就在前幾天,金點時空的網域名稱 www.gpgame.com 註冊一年到期了,我們正在進行續費,但是目...
3D遊戲從頭編 第二回 3D基本概念
金點時空 第二回 3d基本概念上一回我們建立起了 的程式設計環境,但是不要著急開始編碼,我們還是先來看看 中的一些基本概念,這些東西都是 程式設計基礎中的基礎,一定要牢記。用過3dmax的人都知道,乙個 場景是由很多模型 model 組成的,而模型就是通常說的網格 mesh 它是由三角形面 組成,而...