输入汇编器阶段

从内存读取几何数据(顶点和索引)并用这些数据组合为几何图元,构建多边形(点、线段、三角形)。构建多边形的方法取决于所用的基本图元的拓扑类型

顶点

D3D中顶点由空间位置和各种附加属性组成;定义顶点必须附带描述D3D10_INPUT_ELEMENT_DESC

例如:

// 顶点定义
struct Vertex1 {
	D3DXVECTOR3 pos;
  D3DXCOLOR color;
};
// 顶点描述
D3D10_INPUT_ELEMENT_DESC vertexDesc[] = {
	{"POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D10_INPUT_PER_VERTEX_DATA, 0},
  {"COLOR", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 12, D3D10_INPUT_PER_VERTEX_DATA, 0}
};

顶点缓冲区

为了让GPU访问顶点数组,必须把它放置在一个称为缓冲区的特殊资源容器中,该容器由ID3D10Buffer接口表示。创建一个顶点缓冲区的步骤:

  • 填写一个D3D10_BUFFER_DESC结构体,描述我们所要创建的缓冲区。
  • 填写一个D3D10_SUBRESOURCE_DATA结构体,为缓冲区指定初始化数据。
  • 调用ID3D10Device::CreateBuffer方法来创建缓冲区。

图元拓扑

顶点缓冲区只是在连续的内存中存储了一个顶点列表,它并没有说明以何种方式组织顶点,形成几何图元。所以需要通过指定图元拓扑来告诉D3D以何种方式组成几何图元。

  • 点列表
  • 线带
  • 线列
  • 三角形带
  • 三角形列

索引和索引缓冲区

索引
创建一个顶点列表和索引列表。顶点列表包含所有唯一的顶点,而索引列表包含指向顶点列表的索引值,这些索引定义了顶点以何种方式组成三角形。

实验

根据实验文件修改部分代码并理解。

	//设置顶点和索引的数量
	HRESULT hr = S_OK;
	mVertexCount = 3; // 顶点数量
	mIndexCount = 3; // 索引数量
	//设置顶点数组,填充其中每个顶点数据 (三角形)
	ColorVertex vertices[] = {
		{ D3DXVECTOR3(0.0f, 1.0f, 1.0f), WHITE },
		{ D3DXVECTOR3(1.0f, 1.0f, 1.0f), BLACK },
		{ D3DXVECTOR3(1.0f, 0.0f, 1.0f), RED }
	};
	//设置索引数组,填充其中每个索引数据
	DWORD indices[] = { 0, 1, 2 };
  ...
  // 设置顶点缓冲区大小
	vbd.ByteWidth = sizeof(ColorVertex) * mVertexCount;
  // 创建顶点缓冲区
  // vbd 为所创建缓冲区、vinitData 为顶点数据、mVertexBuffer
  pD3dDevice->CreateBuffer(&vbd, &vinitData, &mVertexBuffer)
  // 设置图元拓扑类型:三角形列
	pD3dDevice->IASetPrimitiveTopology(D3D10_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
  

实验结果

绘制四边形

方法:使用三角形列修改顶点索引、顶点数量、顶点数组。

结果:

拉远摄像机位置(两倍)

方法:修改D3DXMatrixLookAtLH()传入的pos第三个参数,传入正整数则拉近摄像机,传入负整数则拉远摄像机。

最后更新于:
2022.09.08