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
相关产品推荐
相关产品推荐

