在介绍如何使用Direct3D项目模版来绘制立体图形之前,首先为读者介绍在Direct3D应用程序开发过程中涉及到的一些常用概念。
(1)资源
资源是指可以被Direct3D图形管线所访问的内存空间,Direct3D使用资源来存储输入输出数据,如几何、纹理和着色数据。在Direct3D图形管线中将资源分为缓存资源和纹理资源,这些资源的具体含义如下:
- 缓存资源,是一组指定类型的数据集合,分为顶点缓存、索引缓存和常量缓存。其中顶点缓存用于存储顶点的位置、法线、纹理和颜色等数据,索引缓存用于存储顶点的索引,一个索引缓存可以指向多个顶点缓存,常量缓存则用于存储着色器的常量数据。
- 纹理资源,是一种用于存储纹理的结构资源,这些纹理包括了一维、二维和三维纹理。
(2)颜色
绘制三维立体图形时,通常会指定图形的各个顶点的颜色来对图形进行渲染。Direct3D中使用RGB和RGBA两种方式来描述颜色,其中R、G、B分别表示红色、绿色和蓝色,A为Alpha值,用于表示透明度。
在Direct3D中使用XMFLOAT3结构体来储存RGB颜色值,定义此结构体的代码如下所示:
struct XMFLOAT3 {
float x;
float y;
float z;
};
从上面的代码中可以看到,在XMFLOAT3结构体中定义了三个float类型的变量x、y和z,此结构体用于储存任意的三个浮点数,如RGB颜色值和顶点的坐标等。这里使用XMFLOAT3结构体中的x变量、y变量和z变量,分别储存R、G、B的颜色值。
通过使用XMFLOAT4结构体来存储RGBA颜色值,定义此结构体的代码如下所示:
struct XMFLOAT4 {
float x;
float y;
float z;
float w;
};
在XMFLOAT4结构体中定义了四个float类型的变量x、y、z和w,其中前三个变量分别用于存储R、G、B的颜色值,w变量则用于存储Alpha值。同XMFLOAT3结构体相似,XMFLOAT4结构体用来储存任意的四个浮点数,在后面的示例中将使用此结构体来储存矩阵。
(3)图形顶点
使用Direct3D绘制立体图形之前,首先要确定立体图形的顶点,使用这些顶点来构成一个立体图形。一个图形顶点包含坐标、颜色和法线等信息,在Direct3D中通常使用一个自定义的结构体来保存这些信息。下面的代码片段定义了一个简单的结构体,在此结构体保存了图形顶点的坐标和颜色信息。
//自定义一个结构体
struct VertexPositionColor
{
//保存图形顶点的坐标
DirectX::XMFLOAT3 pos;
//保存图形顶点的颜色
DirectX::XMFLOAT3 color;
};
在上面的代码片段中,定义了一个结构体VertexPositionColor,并在此结构体中定义两个XMFLOAT3结构体的变量pos和color,分别用于保存图形顶点的坐标和颜色信息。其中坐标信息指顶点的X轴、Y轴和Z轴的坐标,颜色信息则指顶点的RGB颜色值。
VertexPositionColor结构体中所保存的顶点信息需要被显卡识别以后,才能使用这个结构体中的顶点信息来创建一个顶点,在Direct3D中使用D3D11_INPUT_ELEMENT_DESC结构体来描述VertexPositionColor结构体中的顶点信息,此结构体依次包含了如下的成员:
- SemanticName变量,用于描述元素的目的或者语义,如使用POSITION来描述顶点的坐标。
- SemanticIndex变量,用于区分具有相同目的或语义的元素,如一个顶点包含两个颜色信息,而这两个颜色信息的SemanticName都为COLOR时,则将SemanticIndex变量分别设置成0和1来进行区分。
- Format枚举变量,用于指定元素的格式,如使用DXGI_FORMAT_R32G32B32_FLOAT指定元素的格式为三个32位浮点数,元素的总长为12字节。
- InputSlot变量,此变量的值为0~15的整数,在Direct3D 11中最多可以将16个顶点缓存并行地传递给显卡,其中每一个缓存使用唯一的InputSlot变量值来区分。
- AlignedByteOffset变量,用于定义缓存的对齐方式,使GPU能获取到此缓存。
- InputSlotClass枚举变量,一般赋值为D3D11_INPUT_PER_VERTEX_DATA。
- InstanceDataStepRate变量,此变量用于实例技术,若不使用实例技术则赋值为0。
由于在VertexPositionColor结构体中保存了顶点的坐标和颜色信息,因此需要定义一个D3D11_INPUT_ELEMENT_DESC类型的数组来分别描述顶点的坐标和颜色信息。代码如下所示:
//定义一个D3D11_INPUT_ELEMENT_DESC类型的数组
const D3D11_INPUT_ELEMENT_DESC vertexDesc[] =
{
//描述顶点的坐标信息
{ "POSITION",0,DXGI_FORMAT_R32G32B32_FLOAT,0,0,D3D11_INPUT_PER_VERTEX_DATA,0},
//描述顶点的颜色信息
{ "COLOR",0,DXGI_FORMAT_R32G32B32_FLOAT,0,12,D3D11_INPUT_PER_VERTEX_DATA,0},
};
在Direct3D中绘制的立体图形一般包含多个顶点,可以定义一个VertexPositionColor类型的数组来保存这些顶点中的信息,代码如下所示:
VertexPositionColor cubeVertices[] =
{
//顶点{1.0f, 0.0f, 0.0f}
{XMFLOAT3(1.0f, 0.0f, 0.0f), XMFLOAT3(1.0f, 0.0f, 0.0f)},
//顶点{0.0f, 1.0f, 0.0f}
{XMFLOAT3(0.0f, 1.0f, 0.0f), XMFLOAT3(0.0f, 1.0f, 0.0f)},
};
在上面的代码片段中,定义了一个VertexPositionColor类型的数组cubeVertices,此数组保存了两个顶点,这两个顶点的坐标分别为{1.0f, 0.0f, 0.0f }和{0.0f, 1.0f, 0.0f },其中第一个顶点的颜色为红色,而第二个顶点的颜色为绿色。
(4)三维图元
三维图元是组成一个三维图形的基本单元,包括点、线和三角形。其中三角形是较为常用的三维图元,用来组成复杂的多边形、网格和光滑的曲面。
在Direct3D应用程序中若要绘制点、线和三角形这些图元,需要指定图元的拓扑类型,常用的拓扑类型如下所示:
- D3D_PRIMITIVE_TOPOLOGY_POINTLIST,指定图元的拓扑类型为顶点列表。
- D3D_PRIMITIVE_TOPOLOGY_LINELIST,指定图元的拓扑类型为线段列表。
- D3D_PRIMITIVE_TOPOLOGY_LINESTRIP,指定图元的拓扑类型为线段条带。
接下来介绍如何在Direct3D中指定图元的拓扑类型,以及使用指定的图元的拓扑类型所绘制出的效果。首先创建图形的顶点,代码如下所示:
VertexPositionColor cubeVertices[] =
{XMFLOAT3(0.0f, -0.3f, -0.3f), XMFLOAT3(1.0f, 0.0f, 0.0f)},
{XMFLOAT3(0.0f, -0.3f, 0.3f), XMFLOAT3(1.0f, 0.0f, 0.0f)},
{XMFLOAT3(0.0f, 0.3f, 0.0f), XMFLOAT3(1.0f, 0.0f, 0.0f)},
m_d3dContext->IASetPrimitiveTopology(D3D_PRIMITIVE_TOPOLOGY_LINESTRIP);
通过上述的代码指定图元的拓扑类型为线段条带以后,可以在应用窗口中看到图20-20所示的效果。
接着指定图元的拓扑类型为三角形列表,来绘制出独立的三角形。代码如下所示:
m_d3dContext->IASetPrimitiveTopology(D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
通过上述的代码指定了图元的拓扑类型为三角形列表以后,可以看到,使用同样的图形顶点在应用窗口中绘制了一个三角形,如图20-21所示。