如何用DirectX 11绘制空心矩形?现有代码渲染异常求解决
DirectX 11 绘制空心矩形的正确实现
你的怀疑没错,问题确实出在图元拓扑设置和顶点数组结构上——D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP是用来绘制填充三角形的,完全不适合画空心线条类图形。下面是具体的修复方案:
1. 更换图元拓扑
直接把拓扑模式改成线相关的类型,推荐两种选择:
D3D11_PRIMITIVE_TOPOLOGY_LINELIST:适合绘制独立线段,为矩形每条边提供两个顶点,天然支持闭合效果。D3D11_PRIMITIVE_TOPOLOGY_LINESTRIP:绘制连续线段,顶点按顺序连接,但不会自动闭合,需手动添加重复顶点实现闭环。
修改代码中的拓扑设置行:
// 替换原有的 TRIANGLESTRIP 设置 pContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_LINELIST);
2. 调整顶点数组结构
假设你的顶点结构体包含位置信息(比如XMFLOAT3 pos),根据选择的拓扑调整顶点数组:
方案A:用 LINELIST(推荐,直接闭合)
为矩形的4条边各提供一对顶点,共8个顶点:
struct Vertex { XMFLOAT3 pos; }; Vertex OurVertices[] = { // 上边:左上 → 右上 { XMFLOAT3(-1.0f, 1.0f, 0.0f) }, { XMFLOAT3(1.0f, 1.0f, 0.0f) }, // 右边:右上 → 右下 { XMFLOAT3(1.0f, 1.0f, 0.0f) }, { XMFLOAT3(1.0f, -1.0f, 0.0f) }, // 下边:右下 → 左下 { XMFLOAT3(1.0f, -1.0f, 0.0f) }, { XMFLOAT3(-1.0f, -1.0f, 0.0f) }, // 左边:左下 → 左上 { XMFLOAT3(-1.0f, -1.0f, 0.0f) }, { XMFLOAT3(-1.0f, 1.0f, 0.0f) } };
绘制时调用:
pContext->Draw(_countof(OurVertices), 0);
方案B:用 LINESTRIP(需手动闭合)
只需要4个核心顶点,但要在末尾添加第一个顶点的副本实现闭合:
Vertex OurVertices[] = { { XMFLOAT3(-1.0f, 1.0f, 0.0f) }, // 左上 { XMFLOAT3(1.0f, 1.0f, 0.0f) }, // 右上 { XMFLOAT3(1.0f, -1.0f, 0.0f) }, // 右下 { XMFLOAT3(-1.0f, -1.0f, 0.0f) }, // 左下 { XMFLOAT3(-1.0f, 1.0f, 0.0f) } // 重复左上,闭合矩形 };
绘制时调用:
pContext->Draw(_countof(OurVertices), 0);
3. 额外注意事项
如果你的光栅化状态设置了D3D11_FILL_SOLID,这不影响线拓扑的绘制,但如果之前尝试用三角形拓扑配合D3D11_FILL_WIREFRAME生成线框,这种方式会包含矩形的两条对角线,和你要的空心矩形不是一回事,所以优先用线拓扑方案。
内容的提问来源于stack exchange,提问作者user3449922
相关产品推荐
相关产品推荐

