使用TRIANGLESTRIP拓扑绘制立方体线框为何单侧出现两条对角线?
原因与解决办法
核心问题:拓扑类型与索引逻辑不匹配
你的索引是按照**TRIANGLELIST(独立三角形)**的规则编写的——每3个顶点对应一个独立三角形,但你却设置了TRIANGLESTRIP拓扑。这两种拓扑的绘制逻辑完全不同:
TRIANGLELIST:每组3个顶点独立构成一个三角形,相互之间没有关联。TRIANGLESTRIP:从第3个顶点开始,每个新增顶点都会和前两个顶点组成新三角形,条带会连续延伸,前后三角形会共享边。
你的索引用TRIANGLESTRIP解析时,前后独立的三角形组会被强制连接,生成错误的额外边,也就是你看到的多余对角线。
两种可行解决方案:
1. 切换为TRIANGLELIST拓扑(最简单)
既然你的索引本来就是为独立三角形设计的,直接修改拓扑设置即可:
g_pImmediateContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
这样每个3顶点组都会被当作独立三角形绘制,不会产生错误的连接边。
2. 重新编写适配TRIANGLESTRIP的索引
如果一定要用TRIANGLESTRIP,需要调整索引顺序,让顶点按连续条带排列,必要时重复顶点来“断开”不需要的连接(因为TRIANGLESTRIP无法直接中断条带,只能通过重复顶点重置绘制逻辑)。比如立方体的TRIANGLESTRIP索引可以参考如下逻辑(需根据你的顶点位置调整):
// 示例TRIANGLESTRIP索引(需对应顶点顺序调整) WORD stripIndices[] = {0,1,4,5,7,6,2,3,0,4};
额外建议:绘制线框更适合用线段拓扑
如果你的目标是绘制立方体线框,而非填充的立方体,直接使用LINELIST或LINESTRIP拓扑会更直观。立方体有12条棱,用LINELIST的话只需要24个索引(每条棱对应两个顶点),完全不会出现三角形拓扑带来的多余边问题。比如:
// 线框索引示例(LINELIST) WORD lineIndices[] = { 0,1, 1,2, 2,3, 3,0, // 前面 4,5, 5,6, 6,7, 7,4, // 后面 0,4, 1,5, 2,6, 3,7 // 侧边棱 }; g_pImmediateContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_LINELIST);
内容的提问来源于stack exchange,提问作者M4ST3RX
相关产品推荐
相关产品推荐

