为什么顶点顺序会改变渲染行为

Why Order of Vertices Change Rendering Behaviour

我正在学习初级 DirectX 教程。我已经意识到我将顶点放入顶点缓冲区的顺序决定了渲染的成败。例如,这画了一个三角形

myVertex vertices[] = {
    XMFLOAT3(0.0f, 0.4f, 0.5f),
    XMFLOAT3(0.4f, -0.4f, 0.5f),
    XMFLOAT3(-0.4f, -0.4f, 0.5f),
};

虽然这什么也没画,

myVertex vertices[] = {
    XMFLOAT3(-0.4f, -0.4f, 0.5f),
    XMFLOAT3(0.4f, -0.4f, 0.5f),
    XMFLOAT3(0.0f, 0.4f, 0.5f)
};

这取决于光栅化器设置,它允许剔除三角形,具体取决于它们在屏幕中时是顺时针顺序还是逆时针顺序 space。

默认情况下 D3D11_RASTERIZER_DESC 具有 属性: D3D11_CULL_MODE 有 3 个选项: * D3D11_CULL_NONE * D3D11_CULL_FRONT * D3D11_CULL_BACK

要确定哪些三角形是正面或背面,您可以使用 属性 : 正面逆时针

如果为 false,则三角形逆时针方向为背面,顺时针方向为正面。

如果为真,则相反。

默认光栅化器设置(如果您不创建状态并将其分配给管道)是 D3D11_CULL_BACK 和 FrontCounterClockwise=FALSE

所以默认情况下,顺时针三角形不会显示。

如果你想不顾一切地绘制每个三角形,你可以创建一个光栅器状态并使用: D3D11_CULL_NONE

要创建光栅器状态,请使用 ID3D11Device::CreateRasterizerState

要将结果状态附加到管道,请使用 ID3D11DeviceContext::RSSetState