我正在学习Rastertek DirectX教程,这些教程非常好,作者倾向于为不同的事物使用多个着色器。在后面的教程中,他甚至介绍了一个着色器管理器类。
但是,根据其他来源,我认为使用单个具有多个技术的着色器会更有效率。在教程中使用多个着色器是为了简单,还是有一些情况下使用多个着色器比使用单个大着色器更好?
但是,根据其他来源,我认为使用单个具有多个技术的着色器会更有效率。在教程中使用多个着色器是为了简单,还是有一些情况下使用多个着色器比使用单个大着色器更好?
我猜在教程中他们使用它们是为了简单起见。
将它们分组或分开是一种设计决策。在某些情况下,拥有多个着色器是有益的,因为您可以按照自己的意愿组合它们。
截至Windows 8中的DirectX 11,D3DX库已被弃用,因此您会发现它发生了变化。您可以在DirectX Tool Kit的源代码中看到一个例子:http://directxtk.codeplex.com/以及他们如何处理它们的效果。
通常,您将在内存中具有不同的顶点着色器、像素着色器等;技术 tend to join them as one,因此当您编译Shader文件时,为该技术编译特定的顶点和像素着色器。您的Effect对象正在处理设备设置了哪个顶点/像素着色器,当选择一个带有Y Pass的X Technique时。
您可以手动执行此操作,例如,仅编译像素着色器并将其设置为设备。
同时加载多个fx文件并不是一个好主意。如果可以的话,将它们组合起来,并在能够使用全局变量时尽量使用全局变量,以避免出现在VInput结构中的情况。
这样,您就可以获得所需的效果,并将其传递到您自己的着色器类中设置,以处理剩下的部分,包括技术通道。
创建一个抽象ShaderClass和一个抽象ModelClass。
更确切地说,将着色器初始化在您的Graphics类中,与模型分开。如果您使用texture.fx文件创建TextureShader类,则无需初始化另一个实例; 而是与相应的模型共享TextureShader对象,然后创建一个Renderer结构/类,使用虚函数指针来持有着色器指针和(任何)模型指针。