多个着色器与DirectX中的多种技术

时间:2013-01-11 03:14:51

标签: c++ 3d directx shader

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

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

3 个答案:

答案 0 :(得分:4)

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

将它们分类为技术或单独进行是设计决策。在某些情况下,有多个着色器是有益的,因为您可以根据需要组合它们。

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

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

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

答案 1 :(得分:4)

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

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

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

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

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

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

答案 2 :(得分:0)

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

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

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

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