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_DESCAntialiasedLineEnable
和MultisampleEnable
。
见Aliasing和Multisample anti-aliasing
更新:我已将 MSAA 和 AA 模式添加到 DirectX 工具包tutorial。
【讨论】:
我的 rasterizer_desc 已经设置了 AntialiasedLineEnable 和 MultisampleEnable 标志,但似乎没有什么不同 但是您使用的是 MSAA 渲染目标/后台缓冲区吗? 是的,描述的计数设置设置正确 您的设备是什么功能级别?尝试AntialiasedLineEnable
和MultisampleEnable
的四种可能组合。【参考方案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选哪个,有什么区别