微軟D3D設(shè)備能創(chuàng)建和操縱下面初基類型:
l 點(diǎn)列表
l 線列表
l 線帶
l 三角形列表
l 三角形帶
l 三角形扇區(qū)
你能用IDirect3DDevice9接口中的任何粉刷方法在C++程序中粉刷原基。
1.1.1.1. 點(diǎn)列表
一個(gè)點(diǎn)列表是一個(gè)頂點(diǎn)的集合,這些頂點(diǎn)被作為單獨(dú)的點(diǎn)來粉刷。你的程序可以在3-D場景中用它們作為在多邊形表面上開始字段、點(diǎn)線。
下圖描述了一個(gè)粉刷后的點(diǎn)列表。

你的程序能在一個(gè)點(diǎn)列表上應(yīng)用素材和紋理,素材或紋理的顏色僅僅出現(xiàn)在點(diǎn)上,而不是在點(diǎn)之間的任何地方。
下面的代碼顯示怎么樣為頂點(diǎn)創(chuàng)建點(diǎn)列表:
struct CUSTOMVERTEX
{
float x,y,z;
};
CUSTOMVERTEX Vertices[] =
{
{-5.0, -5.0, 0.0},
{ 0.0, 5.0, 0.0},
{ 5.0, -5.0, 0.0},
{10.0, 5.0, 0.0},
{15.0, -5.0, 0.0},
{20.0, 5.0, 0.0}
};
下面的例子展示了怎么樣使用IDirect3DDevice9::DrawPrimitive來粉刷一個(gè)點(diǎn)列表:
//
// It is assumed that d3dDevice is a valid
// pointer to a IDirect3DDevice9 interface.
//
d3dDevice->DrawPrimitive( D3DPT_POINTLIST, 0, 6 );
1.1.1.2. 線列表
一個(gè)線列表是一些獨(dú)立的直線段。線列表在3D場景中添加凍雨或大雨是非常有用。程序通過填充一個(gè)頂點(diǎn)數(shù)組來創(chuàng)建一個(gè)先列表,并且線列表中的頂點(diǎn)數(shù)量必須是偶數(shù)且大于或等于2。
下圖顯示了一個(gè)粉刷線列表:

你可以在線列表上應(yīng)用素材和紋理,素材和紋理的顏色僅僅出現(xiàn)在線上,而不是線之間的任何點(diǎn)。
下面的代碼表明如何為線列表創(chuàng)建頂點(diǎn)。
struct CUSTOMVERTEX
{
float x,y,z;
};
CUSTOMVERTEX Vertices[] =
{
{-5.0, -5.0, 0.0},
{ 0.0, 5.0, 0.0},
{ 5.0, -5.0, 0.0},
{10.0, 5.0, 0.0},
{15.0, -5.0, 0.0},
{20.0, 5.0, 0.0}
};
下面的代碼展示了怎么樣使用IDirect3DDevice9::DrawPrimitive來粉刷一個(gè)線列表:
//
// It is assumed that d3dDevice is a valid
// pointer to a IDirect3DDevice9 interface.
//
d3dDevice->DrawPrimitive (D3DPT_LINELIST, 0, 3);
1.1.1.3. 線帶
線帶是由連接的線段組成的一種原基;你的程序可以使用線帶來創(chuàng)建不關(guān)閉的多邊形。一個(gè)關(guān)閉的多邊形是最后一個(gè)頂點(diǎn)通過線段連接到第一個(gè)頂點(diǎn)的多邊形。如果你的程序制作基于線帶的多邊形,頂點(diǎn)并不保證是共面的。
下圖顯示了一個(gè)粉刷過后的線帶:

下面代碼顯示了如何創(chuàng)建一個(gè)線帶的頂點(diǎn):
struct CUSTOMVERTEX
{
float x,y,z;
};
CUSTOMVERTEX Vertices[] =
{
{-5.0, -5.0, 0.0},
{ 0.0, 5.0, 0.0},
{ 5.0, -5.0, 0.0},
{10.0, 5.0, 0.0},
{15.0, -5.0, 0.0},
{20.0, 5.0, 0.0}
};
下面代碼顯示了怎么樣使用IDirect3DDevice9::DrawPrimitive來粉刷這個(gè)線帶:
//
// It is assumed that d3dDevice is a valid
// pointer to a IDirect3DDevice9 interface.
//
d3dDevice->DrawPrimitive( D3DPT_LINESTRIP, 0, 5 );
1.1.1.4. 三角形列表
三角形列表是一系列獨(dú)立的三角形。他們或許彼此相鄰,也可能不相鄰。一個(gè)三角形列表必須至少有三個(gè)頂點(diǎn),總頂點(diǎn)數(shù)必須能被3整除。
使用三角形列表來創(chuàng)建由不相交的塊組成的對象,例如,在3D游戲中創(chuàng)建FORCE-FIELD墻就使用大量小的不相連的三角形,然后應(yīng)用素材和紋理,看起來散發(fā)光到三角形列表;每個(gè)墻上的三角形看起來都發(fā)光,在墻后面的場景通過三角形之間的縫變的部分可見,就像一個(gè)玩家看到一個(gè)FORCE FIELD一樣。
三角形列表通常用來創(chuàng)建有明顯邊和帶有Gouraud陰影的原基,見Face和頂點(diǎn)法線向量。
下圖顯示一個(gè)著色之后的三角形列表:

下面的代碼顯示如何創(chuàng)建一個(gè)三角形列表的頂點(diǎn):
struct CUSTOMVERTEX
{
float x,y,z;
};
CUSTOMVERTEX Vertices[] =
{
{-5.0, -5.0, 0.0},
{ 0.0, 5.0, 0.0},
{ 5.0, -5.0, 0.0},
{10.0, 5.0, 0.0},
{15.0, -5.0, 0.0},
{20.0, 5.0, 0.0}
};
下面的代碼顯示怎么樣使用IDirect3DDevice9::DrawPrimitive來對這個(gè)三角形列表進(jìn)行著色:
//
// It is assumed that d3dDevice is a valid
// pointer to a IDirect3DDevice9 interface.
//
d3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, 2 );
1.1.1.5. 三角形帶
三角形帶是一系列相互連接的三角形組成。因?yàn)槿切问窍噙B的,程序不需要重復(fù)指定所有三角形的頂點(diǎn);例如:你僅僅需要7個(gè)頂點(diǎn)來定義下面的三角形帶:

系統(tǒng)使用頂點(diǎn)v1,v2和v3來畫第一個(gè)三角形,v2,v4和v3來畫第二個(gè)三角形;v3,v4和v5來化第三個(gè)三角形,v4,v6和v5來畫第四個(gè)三角形等等。注意第二個(gè)三角形的頂點(diǎn)和第4個(gè)三角形的頂點(diǎn)是倒序的,這保證所有的三角形都以順時(shí)針的方向被畫出來。
3D場景中的大多數(shù)對象都是由三角形帶組成,這是因?yàn)槿切螏苡脕硪杂行У厥褂脙?nèi)存和處理時(shí)間的方式指定復(fù)雜的對象。
下面的圖顯示一個(gè)著色后的三角形帶:

下面代碼說明怎么樣為這個(gè)三角形帶定義頂點(diǎn)集合:
struct CUSTOMVERTEX
{
float x,y,z;
};
CUSTOMVERTEX Vertices[] =
{
{-5.0, -5.0, 0.0},
{ 0.0, 5.0, 0.0},
{ 5.0, -5.0, 0.0},
{10.0, 5.0, 0.0},
{15.0, -5.0, 0.0},
{20.0, 5.0, 0.0}
};
下面的代碼展示了怎么樣使用IDirect3DDevice9::DrawPrimitive來為這個(gè)三角形著色:
//
// It is assumed that d3dDevice is a valid
// pointer to a IDirect3DDevice9 interface.
//
d3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 0, 4);
1.1.1.6. 三角形扇區(qū)
除了所有的三角都共享一個(gè)頂點(diǎn)之外,三角形扇和三角形帶相似。如下圖所示:

系統(tǒng)使用v2,v3和v1來畫第一個(gè)三角形,使用v3,v4和v1來畫第二個(gè)三角形,使用v4,v5和v1來畫第三個(gè)等等。當(dāng)平面陰影有效的時(shí)候,系統(tǒng)從第一個(gè)三角形開始使用指定的顏色來陰影。
該圖描述了著色以后的三角形扇:

下面的代碼顯示怎么樣為這個(gè)三角形扇定義頂點(diǎn)集:
struct CUSTOMVERTEX
{
float x,y,z;
};
CUSTOMVERTEX Vertices[] =
{
{ 0.0, 0.0, 0.0},
{-5.0, 5.0, 0.0},
{-3.0, 7.0, 0.0},
{ 0.0, 10.0, 0.0},
{ 3.0, 7.0, 0.0},
{ 5.0, 5.0, 0.0},
};
下面的代碼顯示怎么樣使用IDirect3DDevice9::DrawPrimitive來為這個(gè)三角形扇著色:
//
// It is assumed that d3dDevice is a valid
// pointer to a IDirect3DDevice9 interface.
//
d3dDevice->DrawPrimitive( D3DPT_TRIANGLEFAN, 0, 4 );