DirectX11 TriangleStrip和TriangleList区别

图元类型 D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP

Triangle Strips是D3D用来绘制三角形的一种方式,这种方式比Triangle list更加高效,因为不用重复存储三角形顶点。下面看一个例子,分析一下这两种方式的不同。首先,确认一点,三角形的三个顶点的绘制顺序是顺时针。

现在我们要绘制一个矩形,在D3D中,最基本的几何图元是三角形,所以可用两个三角形拼接成一个矩形,如下图。

rectangle

使用Triangle List绘制

triangle list的工作方式是每次取三个顶点作为一组,绘制一个三角形。如果有n个三角形,那么依次取1,2,3为一组,4,5,6为一组, i, i + 1, i + 2为一组,如下图,如果一共有n个顶点,那么可以绘制n / 3个三角形。

tiangle_list

所以为了绘制上面的矩形,我们一共需要六个顶点,见下图。V1,V2,V3绘制左上角的三角形,V2,V4,V3绘制右下角的三角形。这里,V2和V3被重复定义了(或者说重复存储了)。

 

vertexorder

定义顶点及绘制的核心代码如下

struct VertexPosColor
{
	DirectX::XMFLOAT3 pos;
	DirectX::XMFLOAT4 color;
	static const D3D11_INPUT_ELEMENT_DESC inputLayout[2];
};

// 设置三角形顶点
VertexPosColor vertices[] =
{
	{ XMFLOAT3(-0.5f, 0.5f, 0.5f), XMFLOAT4(0.0f, 1.0f, 0.0f, 1.0f) },
	{ XMFLOAT3(0.5f, 0.5f, 0.5f), XMFLOAT4(0.0f, 1.0f, 0.0f, 1.0f) },
	{ XMFLOAT3(-0.5f, -0.5f, 0.5f), XMFLOAT4(1.0f, 0.0f, 0.0f, 1.0f) },
	{ XMFLOAT3(0.5f, 0.5f, 0.5f), XMFLOAT4(0.0f, 1.0f, 0.0f, 1.0f) },
	{ XMFLOAT3(0.5f, -0.5f, 0.5f), XMFLOAT4(0.0f, 0.0f, 1.0f, 1.0f) },
	{ XMFLOAT3(-0.5f, -0.5f, 0.5f), XMFLOAT4(1.0f, 0.0f, 0.0f, 1.0f) },
};

//设置图元类型
m_pd3dImmediateContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
// 绘制矩形
m_pd3dImmediateContext->Draw(6, 0);

 

使用Triangle Strip绘制

使用triangle strip则完全不必重复定义顶点,先来看看什么是triangle strip,图如下,实际上是一系列连着的三角形,即相邻的两个三角形有一条公用边。这意味着有些顶点时可以重复利用的,我们不必为每个三角形都指定独立的三个顶点,如下图,可以用七个顶点表示五个三角形。如果是triangle list方式,表示五个三角形则需要15个顶点。

triangle_strip

triangle strip取三角形的方式略有不同,每次从编号为i的位置开始依次取三个,i=1,2,3,4。。。也就是1,2,3为一组,2,3,4为一组。i, i + 1, i + 2为一组,见下图。如果有n个顶点,那么可以绘制n - 2个三角形。

trianglestrip

这种方式使得除了第一个和最后一个顶点外,所有的顶点都可以被重复利用,比如顶点V2,它既属于第一个三角形V1V2V3,又属于第二个三角形V2V3V4。所以为了绘制上面的矩形,我们只需要四个顶点。V1, V2, V3绘制左上角的三角形,V2, V4, V3绘制右下角的三角形。这里V2和V3是无需重复定义(或重复存储)的。

定义顶点和绘制的代码如下

struct VertexPosColor
{
	DirectX::XMFLOAT3 pos;
	DirectX::XMFLOAT4 color;
	static const D3D11_INPUT_ELEMENT_DESC inputLayout[2];
};

// 设置三角形顶点
VertexPosColor vertices[] =
{
	{ XMFLOAT3(-0.5f, 0.5f, 0.5f), XMFLOAT4(0.0f, 1.0f, 0.0f, 1.0f) },
	{ XMFLOAT3(0.5f, 0.5f, 0.5f), XMFLOAT4(0.0f, 1.0f, 0.0f, 1.0f) },
	{ XMFLOAT3(-0.5f, -0.5f, 0.5f), XMFLOAT4(1.0f, 0.0f, 0.0f, 1.0f) },
	{ XMFLOAT3(0.5f, -0.5f, 0.5f), XMFLOAT4(0.0f, 0.0f, 1.0f, 1.0f) },
};

//设置图元类型
m_pd3dImmediateContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP);
// 绘制矩形
m_pd3dImmediateContext->Draw(4, 0);

 

除了顶点可以重复利用外,还有一个重要的区别就是绘制时的back face culling选项,如果使用triangle strip绘制,那么这个选项每绘制一个三角形就flip一次,什么意思呢?也就是说如果第一个三角形以CCW方式剔除,那么第二个三角形就以CW方式剔除,第三个三角形又以CCW方式剔除,第四个三角形以CW方式剔除,如此这般。。。这个特征需要我们在定义顶点的时候小心,必须以“锯齿”方式定义顶点才可以。如下。这样第一个三角形V1V2V3是顺时针方向,可以绘制,第二个三角形V2V3V4是逆时针方向,也可以正确绘制。余下类同。

 

alias_order

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章