DirectX11 TriangleStrip和TriangleList区别

编程入门 行业动态 更新时间:2024-10-22 13:50:49

DirectX11 TriangleStrip和TriangleList<a href=https://www.elefans.com/category/jswz/34/1769972.html style=区别"/>

DirectX11 TriangleStrip和TriangleList区别

图元类型 D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP

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

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

使用Triangle List绘制

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

所以为了绘制上面的矩形,我们一共需要六个顶点,见下图。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, 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取三角形的方式略有不同,每次从编号为i的位置开始依次取三个,i=1,2,3,4。。。也就是1,2,3为一组,2,3,4为一组。i, i + 1, i + 2为一组,见下图。如果有n个顶点,那么可以绘制n - 2个三角形。

这种方式使得除了第一个和最后一个顶点外,所有的顶点都可以被重复利用,比如顶点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是逆时针方向,也可以正确绘制。余下类同。

 

更多推荐

DirectX11 TriangleStrip和TriangleList区别

本文发布于:2024-02-26 06:40:48,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1701632.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:区别   TriangleStrip   TriangleList

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!