DX11 中的顶点缠绕顺序

Posted

技术标签:

【中文标题】DX11 中的顶点缠绕顺序【英文标题】:Vertex Winding Order in DX11 【发布时间】:2014-05-21 17:39:21 【问题描述】:

我正在尝试使用 dx11 绘制一个简单的正方形,但每个三角形的索引顺序决定了它是否出现。我在光栅化状态下将剔除模式设置为无,但它似乎没有改变任何东西。

如果我将第一个三角形的顶点指定为 0、1、2 而不是 2、1、0,则三角形不会出现。所以我的问题是,无论剔除模式如何,我是否需要以特定方式对三角形的顶点进行排序?

附:我正在绘制一个三角形列表而不是条形。

UINT indices[] = 2, 1, 0, 
                  1, 3, 0;


MeshVertex vertices[] = 

     Vector3(1.0f, 1.0f, 0.0f), //Top Right
     Vector3(-1.0f, -1.0f, 0.0f), //Bottom Left
     Vector3(1.0f, -1.0f, 0.0f), //Bottom Right
     Vector3(-1.0f, 1.0f, 0.0f) //Top Left
;

mesh = new Mesh(vertices, indices, 4, 6, shader);

【问题讨论】:

DX 顺时针顺序。 【参考方案1】:

所以我的问题是,我是否需要对三角形的顶点进行排序 不考虑剔除模式的具体方式?

** 按顺时针顺序定义/绘制顶点,不要更改默认剔除模式。**

判断一个三角形能否显示,要考虑2个因素

    正面,或者你称之为缠绕顺序,默认情况下,Direct3D 将按顺时针顺序定义的顶点视为正面,而除正面之外的所有面都是背面。 剔除模式,默认情况下,Direct3D 会剔除背面(以逆时针顺序定义顶点的面)。

可以在D3D11_RASTERIZER_DESC结构中设置正面和剔除模式

将剔除模式更改为 NONE 时没有看到差异的原因是因为两个三角形的顺序相同,而 D3D11_CULL_NONE 表示没有剔除任何面。

如果三角形 1 为顺时针顺序,三角形 2 为逆时针顺序,则将剔除模式设置为 D3D11_CULL_FRONT 或 D3D11_CULL_BACK 时只会看到一个三角形,将其设置为 D3D11_CULL_NONE 时会同时看到这两个三角形。

【讨论】:

以上是关于DX11 中的顶点缠绕顺序的主要内容,如果未能解决你的问题,请参考以下文章

顶点的缠绕顺序

获取网格的边界边缘 - 按缠绕顺序

使用topomerge合并topojson会打乱缠绕顺序

OpenGL:深度缓冲向后工作,是不是按缠绕顺序?

用DX9画三角形,三个顶点要求

CGAL 中的 Delaunay_triangulation_2 不保持输入顶点的顺序