DirectX11 非实体线框

Posted

技术标签:

【中文标题】DirectX11 非实体线框【英文标题】:DirectX11 Non-Solid wireframe 【发布时间】:2015-11-08 19:45:29 【问题描述】:

我正在尝试使用 C++ 在 DirectX11 中绘制 100x100 网格,但出现以下问题:

上图显示了我正在线框中绘制的网格,使用了填充模式设置为“D3D11_FILL_WIREFRAME”和“D3D11_PRIMITIVE_TOPOLOGY_LINELIST”拓扑的光栅化器。线框的线条看起来是交错的,而不是笔直的,缺少线框的某些部分。

由于我不确定这个问题是什么,所以我不完全确定我应该寻找什么,因此,感谢任何帮助。

【问题讨论】:

【参考方案1】:

这是一个经典的“走样”问题。

在 Direct3D 11 中,您可以使用作为通用抗锯齿选项的 MSAA,如果您不使用 MSAA,则可以使用特定的线算法。见D3D11_RASTERIZER_DESCAntialiasedLineEnableMultisampleEnable

见Aliasing和Multisample anti-aliasing

更新:我已将 MSAA 和 AA 模式添加到 DirectX 工具包tutorial。

【讨论】:

我的 rasterizer_desc 已经设置了 AntialiasedLineEnable 和 MultisampleEnable 标志,但似乎没有什么不同 但是您使用的是 MSAA 渲染目标/后台缓冲区吗? 是的,描述的计数设置设置正确 您的设备是什么功能级别?尝试AntialiasedLineEnableMultisampleEnable 的四种可能组合。【参考方案2】:

我偶然发现了这个问题的解决方案,这完全不是我所期望的。由于我创建的窗口有轮廓栏,因此 Windows 客户区被歪曲了。因此,当我创建我的图形设备时,我使用 windows 大小而不是 windows 客户端大小来初始化它。不知何故,这导致了上述问题。

我通过使用“GetWindowRect”为窗口实现“GetClientSize”方法解决了这个问题。

【讨论】:

啊,是的,如果后台缓冲区与窗口目标大小不匹配,您将得到一些“压缩”的结果。我验证了如果您使用 MSAA 4X 后备缓冲区,然后使用 D3D11_RASTERIZER_DESC.MultisampleEnable= TRUE,您将获得 AA 行,而没有 MSAA,如果您使用 D3D11_RASTERIZER_DESC .AntialiasedLineEnable = TRUE,您将获得 AA 行

以上是关于DirectX11 非实体线框的主要内容,如果未能解决你的问题,请参考以下文章

DirectX 12和DirectX 11选哪个,有什么区别

使用 DirectX 11 后重置窗口

DirectX11第一篇 DirectX11简介

DirectX 11:运行简单的 DirectX 应用程序时运行时崩溃

巫师3directx11是啥

DirectX 11能解释下是啥意思?