船体,域和几何着色器有什么用途?


21

我为自己的(前任)老板做了相当多的3D游戏编程工作,也为自己的独立游戏使用了自己的自定义引擎。

最初,我从Direct3D 9和D3DX9开始,它们几乎为我完成了所有工作,并且完全不需要我考虑着色器。

在那之后,我写了我的第一个Direct3D 9着色器,但是我所做的一切大多使用一个非常简单的着色器。

在我的游戏引擎的最新迭代中,我移至Direct3D 11,并由此创建了许多着色器。我在GPU中进行了GPU蒙皮,GPU计算的粒子,大量照明和后处理效果。真的很酷的东西。

到目前为止,我仅使用了顶点和像素/片段着色器。即使还有很多事情我还没做完,但我相信我对顶点和像素/片段着色器的功能以及如何将其全部融入整个3D管线具有扎实的知识。

随着最新的发展,我对新的着色器阶段非常感兴趣。也就是说,几何着色器,甚至是更新的Hull和Domain着色器。

我从未使用过这些阶段,但是据我所知,几何着色器(如果启用)在顶点着色器之后运行,对每个变换的顶点(或每个图元一次)运行一次,并允许您丢弃顶点(和图元?)。 ,然后创建新的(我想可以追溯到管道的开头吗?)。

我的猜测是,几何着色器的主要用途是在GPU中以编程方式生成几何。通常的用法是基于单个顶点创建广告牌四边形,但是除了生成分形和其他可以以编程方式100%生成的东西之外,我并没有真正看到许多其他常见场景。

至于Hull和Domain着色器,似乎它们与细分有关(要从粗糙表面创建更平滑的表面吗?),并且必须一起使用或根本不使用。术语“补丁”在这里似乎也很常见。

有人愿意在实践上向我解释这些新的着色器阶段是什么,它们如何适合3D管线,以及在哪种情况下应该考虑使用它们?


我认为您是在问错误的方法-而不是“他们是做什么用的”,而是应该问“他们做什么”-如果您了解给定的资源(及其背后的概念),那么只有天空会限制您的工作实际上能够与他们做。
翁德拉2015年

@wondra:这几乎是一个相同的问题,但是我想更多地关注实际使用示例,而不是理论上对它们的用途的解释。实际上,我已经阅读了很多次有关MSDN的概述,但仍然不明白它们可以为我做什么。我是一个聪明的人,我可以将A和B连接起来,然后从中找出C,D,E和F。
熊猫睡衣

我不知道,“实用用法示例”对我来说似乎有点宽泛。虽然我对此表示怀疑,但是在发表评论之前,所以它可能过于关注您的“他们做什么”。

@Josh:您在现实世界中使用还是曾经使用这些阶段?
熊猫睡衣

1
对于那些具有非Directx背景(例如我自己)的用户来说,这两个FYI在OpenGL和Vulkan中分别称为“镶嵌控件着色器”和“镶嵌评估着色器”。
Shahbaz

Answers:


13

船体与域名

外壳和域着色器阶段是GPU细分曲面流水线的一部分。它们通常用于根据较低细节的输入表面几何来计算高度详细的表面几何,这些输入表面几何定义为三角形或四边形(等等)。低细节输入基元称为“修补程序”,需要注意的是,它们可能并不代表最终会存在的实际几何形状(尽管可以)。除了曲面以外,还可以将其视为贝塞尔曲线的控制点。

外壳着色器采用一个输入补丁并生成一个输出补丁(或多个补丁;这是补丁通常会在其中进行细分的地方)。也可以在外壳着色器中计算有关补丁的常量元数据,并将其输出以供管道的后续阶段处理。

外壳着色器的输出通过一个(固定功能)细分阶段,该阶段会生成适当类型(例如,四边形或三角形)的平铺,标准化区域。

针对这些域执行域着色器,以便计算由上述细分产生的域中任何给定点的实际顶点位置。因此,域着色器输出顶点位置。

细分阶段发生在管线中的顶点着色器阶段之后。

几何着色器

几何着色器在某种程度上类似于简化的外壳/域着色器。它们仅获取输入顶点并生成输出顶点。对于给定的输入顶点,可以生成许多输出顶点,因此可以将它们用于“生成几何图形”。

几何着色器阶段发生在顶点着色器之后和细分阶段之后。

用途

几何着色器可以写入流输出缓冲区,而不是直接馈入管道的光栅化和片段着色阶段。这有效地意味着您可以重新运行通过管道重新组合顶点/外壳/域/几何着色器迭代生成的几何,以在另一个顶点着色器阶段或其他操作中执行其他工作。

什么,你可以使用这些的是一个相当广泛的,有效的,无限的话题,所以我不会真的试图解决这个问题。但是出于某些动机考虑使用它们...这些着色器阶段的重要之处在于,它们使您可以潜在地获得很多额外的细节,而无需始终为它们付出所有的内存或带宽成本。并将处理从CPU转移到GPU。

地形是您可能希望在其中使用某些技术的一个很好的示例,因为通常需要看到它既很近(因为您的角色站在上面)又很远(远处的山脉)并且能够通过这些着色器阶段控制“动态”放置到地形几何中的位置和细节的功能非常强大。从历史上看,替代方案要么一直为地形支付恒定的平均成本(最低分母方法),要么为GPU内存中的不同细节级别手动分页几何块以实现不同的细节级别,这既繁琐又费时。昂贵。

任何类似的情况下,如果您可能需要非常广泛的详细程度范围,则需要支持某些也可以细分的网格或模型,也可能会选择对这些着色器进行巧妙的处理。但是,并非所有事物都能很好地转化为细分曲面样式优化。您可能也可以将它们用于衣服和头发。

为了进一步阅读,包括比我能合理记住或深入的更多细节:


4
请记住,外壳和域着色器需要Direct3D Feature Level 11.0或更高版本的硬件,而几何体着色器则需要Direct3D Feature Level 10.0或更高版本的硬件。而且,大多数视频卡设计几乎没有给几何着色器阶段专用硬件,甚至没有专用硬件,因此它们在实践中的实用性远远少于最初的设想。
Chuck Walbourn

@ChuckWalbourn:如果您愿意,我真的很想听听其他消息
Panda Pajama 2015年
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.