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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 19:06:32