Direct3D 10和着色器管理

时间:2009-05-08 22:22:17

标签: direct3d shader directx-10

我正在使用DirectX 10编写一个3d应用程序,我想知道Shadermanagement的处理方式是什么。

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

此外,我想知道是否需要通过着色器对渲染进行排序,以便最小化着色器开关。

2 个答案:

答案 0 :(得分:2)

我没有使用DX10,只使用DX9,但我猜这些东西仍然是相同的。

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

预加载着色器并不是一个坏主意,具体取决于你是否生成着色器,有多少着色器,你的内存考虑因素 - 取决于它。但是,预加载着色器(我假设你的意思是创建ID3DXEffect实例)只在运行时占用内存,没有CPU使用率。

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

要对您的drawcalls进行排序,请阅读:http://realtimecollisiondetection.net/blog/?p=86

答案 1 :(得分:1)

在D3D10中,所有设备资源都已虚拟化,因此您不会用完它们。当然,如果你不注意你正在做的事情,你仍然可以耗尽卡上的物理资源并引起大量的颠簸。

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

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

realtimecollectiondetection.net博客文章只是谈论对绘制调用进行排序。这将导致更少的状态切换。状态切换的速度并不重要,少做一点总是更快。这是一个很好的一般建议。