2

我正在使用 DirectX 10 编写 3d 应用程序,我想知道 Shadermanagement 的处理方式如何。

在应用程序启动时预加载所有着色器然后根据需要使用它们是否最有效,或者如果数量增加,这是否训练硬件资源?

另外我想知道通过着色器排序渲染是否是速度考虑因素,以便最小化着色器开关。

4

2 回答 2

2

我没有用过 DX10,只有 DX9,但我猜这些东西还是一样的。

根据您的应用程序,您实际上可能会在运行时生成着色器(许多当前复杂的 3D 游戏都会这样做)。

预加载着色器并不是一个坏主意,这取决于您是否生成着色器、有多少个、您的内存考虑因素是什么——这取决于。但是,预加载着色器(我假设您的意思是创建 ID3DXEffect 实例)仅在运行时占用内存,而不占用 CPU。

按着色器排序是个好主意。一般来说,按材质排序是一个好主意,因为切换着色器确实会产生一些开销(不会过多,但根据应用程序的复杂性会很明显)。

要对您的绘制调用进行排序,请阅读以下内容: http ://realtimecollisiondetection.net/blog/?p=86

于 2009-05-08T22:31:00.140 回答
1

在 D3D10 中,所有设备资源都是虚拟化的,因此您不会用完它们。当然,如果你不注意自己在做什么,你仍然可以耗尽卡上的物理资源并导致大量的颠簸。

此外,他们还显着更改了设备状态以降低切换状态的成本,包括着色器。

但是您真正要问的是“对于我的应用程序,方法 X 比方法 Y 快吗?” 尽管 D3D10 简化了状态管理以更快地切换状态,但回答上述问题的唯一方法是对您的应用程序和数据进行性能测量。

realtimecollectiondetection.net 博客文章只是在讨论对绘制调用进行排序。这将导致更少的状态切换。不管状态切换有多快,做的越少总是越快。所以这是一个很好的一般建议。

于 2009-07-18T09:05:07.547 回答