为什么Direct3D 10或更高版本不支持三角风扇?


16

如文档所述,Direct3D 10或更高版本不支持三角风扇

为什么?使用三角风扇有固有的缺点吗?


5
我的理解是,因为三角形风扇通常会导致非常细长的长三角形,从而导致互操作性导致伪像。我还认为,它需要单独的绘制调用来呈现未与风扇连接的任何尝试。尽可能使用Strip。我不认为粉丝有什么可以做的,脱衣舞不能做的更好。
ClassicThunder 2012年

3
风扇可以使用索引连接,因此不需要单独的呼叫。同样适用于条带(甚至可以将风扇与条带连接),它更加灵活,不需要退化的Tris,并且在带宽方面更轻巧。
Maximus Minimus 2012年

Answers:


15

十多年来,硬件供应商一直在推动三角带,索引三角列表和索引三角带作为使用最快的基本类型。为什么?条带具有更好的缓存局部性(重用提交的最后2个版本,而不必连续跳回第一个版本),索引使硬件顶点缓存可以实际工作,并且在消除重复版本方面更有效。

如果所有硬件供应商都说“这样做,您将变得更快”,那么很有可能,如果这样做,您实际上会更快。

因此,D3D10 +对此进行了形式化。如果这是快速路径,那么这就是您要使用的路径,其他路径将不存在。这与D3D10 +的一种设计理念保持一致,即将您带入快速路径并保持在那儿。


4

我不知道这实际上对开发有多大影响,但是与任何此类更改一样,据说它们将使驱动程序开发人员编写更好的驱动程序。GPU驱动程序的复杂性令人惊讶,但是我不确定这种确切的变化是否会有所帮助。

无论哪种情况,都可以用条带代替大多数需要(例如凸多边形渲染)的三角形风扇,效果通常更好。

// A simplified API interface is presented for the purposes of having readable pseudocode
// Push( pos ) - pushes position data to make a new vertex
// TRIANGLE FANS:
for( i = 0; i < vertices.count; ++i )
    Push( vertices[ i ] );

// TRIANGLE STRIPS:
for( i = 0; i < vertices.count; ++i )
{
    if( i % 2 == 0 )
        vertex = i / 2;
    else
        vertex = vertices.count - 1 - i / 2;
    Push( vertices[ vertex ] );
}

编辑:忘了提及-如果您需要更改绕线顺序-只需在该“ if”(==到!=)中反转测试即可。


3

(这个特定问题值得一个观点答案:)

从主观上讲,我想说它的结构是航天的。OpenGLES还抛出了很多东西,以使其“不那么复杂”,而实际上只是使用遗留代码将复杂性推给了每个开发人员。

当然,即使硬件本身不支持它,通过将三角形风扇转换为带状或三角形来提供与对三角形风扇进行排序的人的兼容性也是微不足道的。

WebGL运行时等必须始终跟踪经过验证的缓冲区,并且驱动程序可以轻松地管理向其发送粉丝的人员,即使他们不支持它。

所以整个抛出 FFP的和这种仅仅是一个很大的烦恼 IMO。


10年前或更早之前,这将是一个很好的答案。如今,顶点管线几乎总是在硬件中实现的,并且顶点数据更有可能存储在GPU内存中的缓冲区对象中,因此,在驱动程序中假想的扇到条实现将需要将顶点数据拉回到CPU内存中重新排序,然后将其重新加载到GPU内存。这不仅破坏了使用缓冲区对象的全部要点(因为您不再拥有静态顶点数据),而且还需要从GPU内存中进行回读,因此,hello流水线会停滞并降低性能。
Maximus

1
@ mh01哪些硬件本机不支持风扇?硬件毕竟必须与完整的OpenGL配合使用
2012年

顶点数据可能存储在GPU内存中,但首先必须以某种方式(至少一次)从系统内存中到达顶点数据。那是通过驱动程序。(假设数据起源于CPU端,除了专门的硬件演示,它几乎总是这样做)。
BrainSlugs83 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.