在介绍如何使用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变量分别设置成01来进行区分。
  • 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应用程序中若要绘制点、线和三角形这些图元,需要指定图元的拓扑类型,常用的拓扑类型如下所示:

接下来介绍如何在Direct3D中指定图元的拓扑类型,以及使用指定的图元的拓扑类型所绘制出的效果。首先创建图形的顶点,代码如下所示:

VertexPositionColor cubeVertices[] =

{

    //顶点{0.0f, -0.3f, -0.3f}

    {XMFLOAT3(0.0f, -0.3f, -0.3f), XMFLOAT3(1.0f, 0.0f, 0.0f)},

    //顶点{0.0f, -0.3f, 0.3f}

    {XMFLOAT3(0.0f, -0.3f, 0.3f), XMFLOAT3(1.0f, 0.0f, 0.0f)},

    //顶点{0.0f, 0.3f, 0.0f}

    {XMFLOAT3(0.0f, 0.3f, 0.0f), XMFLOAT3(1.0f, 0.0f, 0.0f)},

};

在上面的代码片段中,定义一个VertexPositionColor类型的数组cubeVertices,在此数组中保存了三个图形顶点,这些顶点的坐标为{0.0f, -0.3f, -0.3f }、{0.0f, -0.3f, 0.3f }和{0.0f, 0.3f, 0.0f },颜色都为红色。

接下来通过调用一个ID3D11DeviceContext类型的对象m_d3dContext中的IASetPrimitiveTopology函数,指定图元的拓扑类型线段条带,来绘制出首尾相接的线段。代码如下所示:

//指定图元的拓扑类型为线段条带

m_d3dContext->IASetPrimitiveTopology(D3D_PRIMITIVE_TOPOLOGY_LINESTRIP);

通过上述的代码指定图元的拓扑类型为线段条带以后,可以在应用窗口中看到图20-20所示的效果。

图20-20 首尾相接的线段

接着指定图元的拓扑类型三角形列表,来绘制出独立的三角形。代码如下所示:

//指定图元的拓扑类型为三角形列表

m_d3dContext->IASetPrimitiveTopology(D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST);

通过上述的代码指定了图元的拓扑类型三角形列表以后,可以看到,使用同样的图形顶点在应用窗口中绘制了一个三角形,如图20-21所示。

图20-21 独立的三角形

posted on 2017-03-30 13:07  冯瑞涛  阅读(899)  评论(0编辑  收藏  举报