DirectX中的多个着色器与多个技术之间的区别

5
我正在学习Rastertek DirectX教程,这些教程非常好,作者倾向于为不同的事物使用多个着色器。在后面的教程中,他甚至介绍了一个着色器管理器类。
但是,根据其他来源,我认为使用单个具有多个技术的着色器会更有效率。在教程中使用多个着色器是为了简单,还是有一些情况下使用多个着色器比使用单个大着色器更好?
3个回答

4
大部分的答案会是:这要看情况。
Effect框架提供了一个很大的优势,即您可以使用Pass->Apply一次性设置整个管道,这可以使事情变得非常容易,但如果不适当使用可能会导致代码非常缓慢,这可能就是为什么微软决定将其弃用的原因,但您可以使用多个着色器效果更糟甚至更差,DirectXTK实际上是一个非常好的例子(只适用于手机开发)。
在大多数情况下,使用Effect框架将产生一些额外的API调用,这些调用可以通过使用单独的着色器来避免(如果您受到绘制调用限制的影响,则可以进行重要调整/实例化技术优化)。使用单独的着色器,您必须自己处理所有状态/常量缓冲区管理,并且如果您知道自己在做什么,可能以更有效的方式进行处理。
我真正喜欢fx框架的是非常好的反射和语义的使用,在设计阶段这可能非常有用(例如,如果您执行float4x4 tP : PROJECTION,则引擎可以自动将相机投影绑定到着色器)。
此外,着色器阶段之间的布局验证对于作者来说确实非常方便(fx框架)。
单独着色器的一个很大的优势是您可以轻松地交换所需的阶段,因此可以节省相当多的排列组合,而不必触及其余的管道。

4

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

将它们分组或分开是一种设计决策。在某些情况下,拥有多个着色器是有益的,因为您可以按照自己的意愿组合它们。

截至Windows 8中的DirectX 11,D3DX库已被弃用,因此您会发现它发生了变化。您可以在DirectX Tool Kit的源代码中看到一个例子:http://directxtk.codeplex.com/以及他们如何处理它们的效果。

通常,您将在内存中具有不同的顶点着色器、像素着色器等;技术 tend to join them as one,因此当您编译Shader文件时,为该技术编译特定的顶点和像素着色器。您的Effect对象正在处理设备设置了哪个顶点/像素着色器,当选择一个带有Y Pass的X Technique时。

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


0

同时加载多个fx文件并不是一个好主意。如果可以的话,将它们组合起来,并在能够使用全局变量时尽量使用全局变量,以避免出现在VInput结构中的情况。

这样,您就可以获得所需的效果,并将其传递到您自己的着色器类中设置,以处理剩下的部分,包括技术通道。

创建一个抽象ShaderClass和一个抽象ModelClass。

更确切地说,将着色器初始化在您的Graphics类中,与模型分开。如果您使用texture.fx文件创建TextureShader类,则无需初始化另一个实例; 而是与相应的模型共享TextureShader对象,然后创建一个Renderer结构/类,使用虚函数指针来持有着色器指针和(任何)模型指针。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接