5

我正在浏览所有Rastertek DirectX 教程,顺便说一句,这些教程非常好,作者倾向于为不同的事情使用多个着色器。在后来的一个教程中,他甚至介绍了一个着色器管理器类。

基于其他一些来源,尽管我相信使用具有多种技术的单个着色器会更有效。教程中的多个着色器是为了简单起见,还是在某些情况下使用多个着色器会比一个大着色器更好?

4

3 回答 3

4

大多数答案是:这取决于。

效果框架提供了一个很大的优势,您可以使用 Pass->Apply 一次性设置整个管道,这可以让事情变得非常简单,但如果使用不当会导致代码非常慢,这可能是微软决定弃用它的原因,但是您可以使用多个着色器做同样糟糕甚至更糟的事情,directxtk 实际上就是一个很好的例子(它只适用于手机开发)。

在大多数情况下,效果框架会产生一些额外的 api 调用,您可以避免使用单独的着色器(我同意如果您的绘制调用绑定可能很重要,但是您应该考虑使用剔除/实例化技术优化该部分)。使用单独的着色器,您必须自己处理所有状态/常量缓冲区管理,如果您知道自己在做什么,可能会以更有效的方式进行。

我真正喜欢 fx 框架的是非常好的反射和语义的使用,这在设计阶段非常有用(例如,如果你做 float4x4 tP : PROJECTION,你的引擎可以自动将相机投影绑定到着色器)。

此外,着色器阶段之间的编译时布局验证对于创作(fx 框架)非常方便。

单独着色器的一大优势是您可以轻松地只交换您需要的阶段,因此您可以节省大量排列,而无需触及管道的其余部分。

于 2013-01-20T13:10:06.637 回答
4

我猜他们在教程中使用它们是为了简单。

将它们按技术分组或单独分组是一项设计决策。在某些情况下,拥有多个着色器是有益的,因为您可以随意组合它们。

从 Windows 8 中的 DirectX 11 开始,不推荐使用 D3DX 库,因此您会发现它发生了变化。您可以在 DirectX Tool Kit 的源代码中看到一个示例:http: //directxtk.codeplex.com/以及它们如何处理它们的效果。

通常你会在内存中有不同的顶点着色器、像素着色器等;技术倾向于将它们结合为一个,因此当您编译着色器文件时,会针对该技术编译特定的顶点和像素着色器。Your Effect Objects is handling what Vertex/Pixel Shader the device is been set when an X Technique with a Y Pass is chosen.

您可以手动执行此操作,例如,仅编译像素着色器并将其设置到设备。

于 2013-01-11T03:50:52.010 回答
0

加载多个 fx 文件绝不是一个好主意。如果可以,请合并您的 fx 文件,如果不需要在您的 VInput 结构中,则尽可能使用全局变量。

通过这种方式,您可以获得所需的效果,并将您在自己的 Shader 类中设置的内容传递给它,以处理其余部分,包括技术通道。

让自己成为一个抽象的 ShaderClass 和一个抽象的 ModelClass。

更准确地说,让您的着色器在您的 Graphics 类中与您的模型分开初始化。如果您使用您的 texture.fx 文件创建一个 TextureShader 类,则无需初始化它的另一个实例;而是与适当的模型共享 TextureShader 对象,然后创建一个 Renderer 结构/类以在需要时使用虚拟来保存着色器指针和(无论如何)模型指针。

于 2014-07-14T18:50:46.780 回答