微软D3D设备能创建和操纵下面初基类型:
l 点列表
l 线列表
l 线带
l 三角形列表
l 三角形带
l 三角形扇区
你能用IDirect3DDevice9接口中的任何粉刷方法在C++程序中粉刷原基。
1.1.1.1. 点列表
一个点列表是一个顶点的集合,这些顶点被作为单独的点来粉刷。你的程序可以在3-D场景中用它们作为在多边形表面上开始字段、点线。
下图描述了一个粉刷后的点列表。
你的程序能在一个点列表上应用素材和纹理,素材或纹理的颜色仅仅出现在点上,而不是在点之间的任何地方。
下面的代码显示怎么样为顶点创建点列表:
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来粉刷一个点列表:
//
// It is assumed that d3dDevice is a valid
// pointer to a IDirect3DDevice9 interface.
//
d3dDevice->DrawPrimitive( D3DPT_POINTLIST, 0, 6 );
1.1.1.2. 线列表
一个线列表是一些独立的直线段。线列表在3D场景中添加冻雨或大雨是非常有用。程序通过填充一个顶点数组来创建一个先列表,并且线列表中的顶点数量必须是偶数且大于或等于2。
下图显示了一个粉刷线列表:
你可以在线列表上应用素材和纹理,素材和纹理的颜色仅仅出现在线上,而不是线之间的任何点。
下面的代码表明如何为线列表创建顶点。
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来粉刷一个线列表:
//
// It is assumed that d3dDevice is a valid
// pointer to a IDirect3DDevice9 interface.
//
d3dDevice->DrawPrimitive (D3DPT_LINELIST, 0, 3);
1.1.1.3. 线带
线带是由连接的线段组成的一种原基;你的程序可以使用线带来创建不关闭的多边形。一个关闭的多边形是最后一个顶点通过线段连接到第一个顶点的多边形。如果你的程序制作基于线带的多边形,顶点并不保证是共面的。
下图显示了一个粉刷过后的线带:
下面代码显示了如何创建一个线带的顶点:
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来粉刷这个线带:
//
// It is assumed that d3dDevice is a valid
// pointer to a IDirect3DDevice9 interface.
//
d3dDevice->DrawPrimitive( D3DPT_LINESTRIP, 0, 5 );
1.1.1.4. 三角形列表
三角形列表是一系列独立的三角形。他们或许彼此相邻,也可能不相邻。一个三角形列表必须至少有三个顶点,总顶点数必须能被3整除。
使用三角形列表来创建由不相交的块组成的对象,例如,在3D游戏中创建FORCE-FIELD墙就使用大量小的不相连的三角形,然后应用素材和纹理,看起来散发光到三角形列表;每个墙上的三角形看起来都发光,在墙后面的场景通过三角形之间的缝变的部分可见,就像一个玩家看到一个FORCE FIELD一样。
三角形列表通常用来创建有明显边和带有Gouraud阴影的原基,见Face和顶点法线向量。
下图显示一个着色之后的三角形列表:
下面的代码显示如何创建一个三角形列表的顶点:
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来对这个三角形列表进行着色:
//
// It is assumed that d3dDevice is a valid
// pointer to a IDirect3DDevice9 interface.
//
d3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, 2 );
1.1.1.5. 三角形带
三角形带是一系列相互连接的三角形组成。因为三角形是相连的,程序不需要重复指定所有三角形的顶点;例如:你仅仅需要7个顶点来定义下面的三角形带:
系统使用顶点v1,v2和v3来画第一个三角形,v2,v4和v3来画第二个三角形;v3,v4和v5来化第三个三角形,v4,v6和v5来画第四个三角形等等。注意第二个三角形的顶点和第4个三角形的顶点是倒序的,这保证所有的三角形都以顺时针的方向被画出来。
3D场景中的大多数对象都是由三角形带组成,这是因为三角形带能用来以有效地使用内存和处理时间的方式指定复杂的对象。
下面的图显示一个着色后的三角形带:
下面代码说明怎么样为这个三角形带定义顶点集合:
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来为这个三角形着色:
//
// It is assumed that d3dDevice is a valid
// pointer to a IDirect3DDevice9 interface.
//
d3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 0, 4);
1.1.1.6. 三角形扇区
除了所有的三角都共享一个顶点之外,三角形扇和三角形带相似。如下图所示:
系统使用v2,v3和v1来画第一个三角形,使用v3,v4和v1来画第二个三角形,使用v4,v5和v1来画第三个等等。当平面阴影有效的时候,系统从第一个三角形开始使用指定的颜色来阴影。
该图描述了着色以后的三角形扇:
下面的代码显示怎么样为这个三角形扇定义顶点集:
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来为这个三角形扇着色:
//
// It is assumed that d3dDevice is a valid
// pointer to a IDirect3DDevice9 interface.
//
d3dDevice->DrawPrimitive( D3DPT_TRIANGLEFAN, 0, 4 );