首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Direct3D线宽

Direct3D线宽
EN

Stack Overflow用户
提问于 2010-02-17 19:11:38
回答 4查看 19.4K关注 0票数 17

使用Direct3D绘制线条列表时,如何更改线条的粗细?

This post说不支持线条宽度,并继续提供解决方法。其他选择?

当我们在这个主题上的时候,着色器允许使用虚线模式绘制线条吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-02-18 01:10:04

可以使用几何体着色器,该着色器将线段作为输入,并输出四边形(由两个三角形组成的三角形带),以便四边形的宽度在屏幕空间中保持恒定,并与所需的线粗细匹配。它工作得很好(因为已经在CAD 3D引擎中实现了它)。

如果几何体着色器不是一个选项,解决方法可能是使用顶点着色器,但这需要对VB进行一些重新处理。请记住,VS必须了解线段的整体情况,因此您最终将存储每个VB元素的p和p+1,以及复制索引/顶点的成本(取决于所使用的拓扑以及是否将您的线条呈现为索引图元)。

如果性能不是问题,那么在CPU上进行扩展可能是可行的。

编辑:

关于虚线模式:您也可以使用几何体着色器来模拟glLineStipple行为。如果具有GL_LINES拓扑,即孤立线,则填充图案将在每个新线段处重新开始。因此,您只需在几何着色器中计算线段的屏幕空间水平开始(或垂直开始,取决于方向),并将此额外信息传递给像素着色器。然后,像素着色器将负责根据因子和图案值丢弃碎片(DirectX 10/11整数和位指令使其更容易)。

同样,这也很有效,您可以将其与模拟宽度线相结合(使用上面提到的第一种技术)。

现在,如果您有GL_LINE_STRIP拓扑,模式将在每个新的原语处重新启动(对于每个新的绘制调用也是如此)。情况变得有点复杂,因为您需要了解以前渲染过的像素数,以及每个线段的像素数。

您可以通过使用DirectX 10流输出功能在临时VB中呈现线条来实现这一点(此VB的每个元素对应于每个段的屏幕空间长度)。然后,您必须对此VB执行并行前缀求和(又称扫描)(用于累加每个线段长度值)。

最后,像GL_LINES一样渲染你的线条,但是在PS中使用这个额外的扫描VB信息。

票数 17
EN

Stack Overflow用户

发布于 2010-02-18 17:04:01

线条粗细不仅不被Direct3D支持,而且也不被任何现有的图形处理器所支持。据我所知,根本没有GPU可以绘制正确的线条(它们都是通过使用退化多边形来伪线-即第二个和第三个顶点在同一位置,因此三角形基本上折叠为一条线)。

虽然可以在OpenGL中设置线宽,但OpenGL驱动程序会创建挤出的四边形(和当前的图形处理器也不支持,并使用每个四边形的两个三角形进行模拟)来在屏幕上绘制“线”。

因此,可能没有办法为此目的创建挤出四边形。正如Stringer Bell在他的回答中所解释的那样,有几种方法可以实现这一点。

对我来说最简单的方法是创建一个包含每个顶点两次的顶点缓冲区,法线指向“右”或“左”,这取决于它们是直线的右边缘还是左边缘。然后,一个非常简单的顶点着色器可以执行挤出(通过按其法线向量的倍数更改顶点位置)。这样,您可以快速更改线条宽度,而不必在CPU上重新计算几何图形。如果要根据对象的大小或距离调整线条宽度,这将非常有用。

票数 17
EN

Stack Overflow用户

发布于 2010-06-04 09:28:34

"The ID3DXLine interface implements line drawing using textured triangles."

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2280077

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档