DirectX中的多重着色器vs多重技术

Multiple shaders vs multiple techniques in DirectX

本文关键字:vs 技术 DirectX      更新时间:2023-10-16

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

基于一些其他的来源,虽然我相信它会更有效地使用单一的着色器与多种技术代替。在教程中使用多个着色器是为了简单,还是有一些场景使用多个着色器会比一个大的更好?

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

将它们按技术分组或单独分组是一个设计决策。在某些情况下,拥有多个着色器是有益的,因为你可以根据自己的喜好组合它们。

作为DirectX 11在Windows 8中,D3DX库是不赞成的,所以你会发现它的变化。你可以在DirectX工具包的源代码中看到一个例子:http://directxtk.codeplex.com/以及他们如何处理他们的效果。

通常你会在内存中有不同的顶点着色器,像素着色器等;技术倾向于将它们合并为一个,所以当你编译着色器文件时,针对该技术编译特定的顶点和像素着色器。当选择带有Y通道的X技术时,您的效果对象正在处理设备设置的顶点/像素着色器。

你可以手动完成,例如,只编译像素着色器并将其设置为设备。

大多数人的回答是:看情况。

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

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

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

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

独立着色器的一大优点是你可以很容易地只交换你需要的阶段,所以你可以节省相当数量的排列,而不触及管道的其余部分。

加载多个fx文件绝不是一个好主意。如果可以的话,组合你的fx文件,如果不需要在你的VInput结构体中,可以使用全局变量。

这样你就可以得到你需要的效果,并把你在自己的Shader类中设置的东西传递给它,以处理剩下的包括技术通道。

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

更准确地说,在你的图形类中初始化你的着色器与你的模型分开。如果你用纹理创建一个textushader类。Fx文件,则不需要初始化它的另一个实例;而不是与适当的模型共享textushader对象创建一个Renderer结构/类来保存着色器指针和模型指针(无论什么),当你需要的时候使用virtual。