You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

D3D12绘制矩形为何需采用'N'形顶点顺序?

D3D12矩形渲染顶点顺序问题原因解析

在D3D12中绘制矩形时,只有采用“N”形顶点顺序才能正确渲染出完整矩形,以下是两种顶点顺序的代码及对应结果:

第一种:常规矩形顶点顺序

代码:

struct GRS_VERTEX
{
    XMFLOAT4 Position;
    XMFLOAT4 Color;
};

GRS_VERTEX stTriangleVertices[] =
{
    { { -0.75f, -0.75f, 0.0f ,1.0f }, { 1.0f, 0.0f, 0.0f, 1.0f } }, // 左下
    { { -0.75f, 0.75f, 0.0f ,1.0f  }, { 0.0f, 1.0f, 0.0f, 1.0f } }, // 左上
    { { 0.75f, 0.75f, 0.0f  ,1.0f }, { 0.0f, 0.0f, 1.0f, 1.0f } }, // 右上
    { { 0.75f, -0.75f, 0.0f  ,1.0f }, { 0.0f, 0.0f, 0.25f, 1.0f } } // 右下
};

// ...

pICMDList->DrawInstanced(4, 1, 0, 0);

对应渲染结果:仅显示右上三角形(半个矩形)

第二种:“N”形顶点顺序

代码:

struct GRS_VERTEX
{
    XMFLOAT4 Position;
    XMFLOAT4 Color;
};

GRS_VERTEX stTriangleVertices[] =
{
    { { -0.75f, -0.75f, 0.0f ,1.0f }, { 1.0f, 0.0f, 0.0f, 1.0f } }, // 左下
    { { -0.75f, 0.75f, 0.0f ,1.0f  }, { 0.0f, 1.0f, 0.0f, 1.0f } }, // 左上
    { { 0.75f, -0.75f, 0.0f  ,1.0f }, { 0.0f, 0.0f, 1.0f, 1.0f } }, // 右下
    { { 0.75f, 0.75f, 0.0f  ,1.0f }, { 0.0f, 0.0f, 0.25f, 1.0f } } // 右上
};

// ...

pICMDList->DrawInstanced(4, 1, 0, 0);

对应渲染结果:完整矩形

核心原因分析

1. 图元拓扑类型

你的代码默认使用D3D_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP(三角带)拓扑,这种模式会将连续顶点自动组合为三角形:

  • 第1个三角形:顶点0→1→2
  • 第2个三角形:顶点1→2→3(三角带会自动翻转奇数位三角形的环绕顺序,保证正面一致性)

2. D3D默认的正面规则与背面剔除

Direct3D默认遵循以下规则:

  • 顺时针环绕的三角形判定为正面
  • 默认开启背面剔除(D3D12_CULL_MODE_BACK),仅渲染正面三角形,丢弃背面三角形

第一种顺序的问题

常规矩形顺序生成的两个三角形:

  • 三角形0→1→2:从屏幕视角看为逆时针环绕,属于背面,被剔除
  • 三角形1→2→3:顺时针环绕,属于正面,被保留
    最终仅显示半个矩形

第二种“N”形顺序的合理性

“N”形顺序生成的两个三角形:

  • 三角形0→1→2:顺时针环绕,正面,被保留
  • 三角带自动翻转第二个三角形的顺序为3→2→1,从屏幕视角看仍为顺时针环绕,正面,被保留
    两个三角形拼接后形成完整矩形

其他解决思路

  • 若想使用常规矩形顶点顺序,可将图元拓扑修改为D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST,并手动提供两个独立三角形的顶点(比如0→1→2、0→2→3)
  • 也可关闭背面剔除(设置D3D12_CULL_MODE_NONE),但会增加不必要的渲染开销,不推荐

内容的提问来源于stack exchange,提问作者DGAF

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 06:55:15