gpt4 book ai didi

directx - 再一次: triangle strips vs triangle lists

转载 作者:行者123 更新时间:2023-12-04 10:01:01 28 4
gpt4 key购买 nike

在(不久前)阅读索引索引的三角形列表后,由于需要较少的绘制调用,因此我决定在三角形列表上构建我的引擎。今天,我偶然发现了0xffffffff,在DX中该值被认为是 strip 切割索引,因此您可以在一个调用中绘制多个 strip 。这是否意味着三角形列表不再具有更高的性能?

最佳答案

可以使用degenerate triangles在单个绘制调用中绘制多个三角形带,它们的面积为零。通过简单地重复上一个 strip 的最后一个顶点和下一个 strip 的第一个顶点,并在每个 strip 中断处添加两个元素(两个零面积三角形),即可进行 strip 切割。

Direct3D 10中的新增功能是带状切割索引(用于索引几何)和RestartStrip HLSL function。两者都可以用来代替简并三角形方法,从而有效地降低了带宽成本。 (而不是切割的两个索引,只需要一个。)

表现力

可以将任何原始列表转换为相等的条,反之亦然吗? strip 到列表的转换当然是微不足道的。对于列表到 strip 的转换,我们必须假设我们可以剪切 strip 。然后,我们可以将列表中的每个基元映射到一个基元子带,尽管这将无济于事。

因此,至少对于三角形图元, strip 和列表始终具有相同的表现力。在Direct3D 10 Strip之前,不可能在任何地方切线,因此它们实际上并没有同样的表现力。

内存和带宽

需要向GPU发送多少数据?为了比较这些方法,我们需要能够计算特定拓扑所需的元素数量。

基本列表公式

N ... total number of elements (vertices or indices)
P ... total number of primitives
n ... elements per primitive (point => 1, line => 2, triangle => 3)

N = Pn

基本条形公式
N, P, n ... same as above
S ... total number of sub-strips
o ... primitive overlap
c ... strip cut penalty

N = P(n-o) + So + c(S-1)

图元重叠描述了相邻图元共享的元素数量。在经典三角带中,三角形使用前一个图元的两个顶点,因此重叠为2。在直线带中,线之间仅共享一个顶点,因此重叠为1。使用重叠1的三角形带当然是理论上可行,但在Direct3D中没有表现形式。

带钢切割罚金是开始新的子带所需的元素数量。这取决于所使用的方法。使用带状切割索引时,惩罚将为1,因为一个索引用于分隔两个带。使用简并三角形,惩罚是两个,因为我们需要两个零面积三角形进行带状切割。

根据这些公式,我们可以得出结论,这取决于几何形状,哪种方法需要的空间最少。

快取

strip 的一个重要属性是数据的高 temporal locality。组装新的图元时,需要从GPU内存中获取每个顶点。对于三角形,必须执行三遍。现在访问内存通常很慢,这就是处理器使用多个级别的缓存的原因。在最佳情况下,所需的数据已存储在缓存中,从而减少了内存访问时间。现在,对于三角形带,使用了上一个图元的最后两个顶点,几乎可以保证高速缓存中已经存在三个顶点中的两个。

使用方便

如上所述,将列表转换为带状区非常简单。问题是通过减少子带的数量将列表转换为有效的原始带。对于简单的程序生成的几何图形(例如,高度 field 形),通常是可以实现的。为现有网格编写转换器可能会更困难。

结论

Direct3D 10的引入对脱机与列表问题的影响不大。现在,线带具有相同的表现力,并且数据略有减少。在任何情况下,使用 strip 时,如果减少子 strip 的数量,您将始终获得最大 yield 。

关于directx - 再一次: triangle strips vs triangle lists,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16881807/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com