C ++& DirectX - 设置着色器

时间:2010-08-04 19:29:36

标签: c++ performance directx shader

有人知道通过DirectX调用着色器处理的快速方法吗?

现在我正在使用D3DXCreateEffectFromFile调用设置着色器,这些调用会在*.fx文件的运行时(每个着色器一次)中创建着色器。

为每个对象渲染部分(我的案例中的每个补丁 - 请参阅进一步),然后意味着:

// --------------------
// Preprocessing
effect->Begin();
effect->BeginPass(0);
effect->SetMatrix (or Vector or whatever - internal shader parameters) (...)
effect->CommitChanges();

// --------------------
// Geometry rendering

// Pass the geometry to render
// ...

// --------------------
// Postprocessing

// End 'effect' passes
effect->EndPass();
effect->End();

这没关系,但是探查器显示了奇怪的东西 - preprocessing (参见代码)占用了大约60%的时间(我是渲染256个补丁的地形对象,其中每个补丁包含大约10k个顶点)

实际几何渲染需要约35%并且后期处理 - 占总渲染时间的5%。

这对我来说似乎很奇怪,我猜D3DXEffect接口可能不是这类事情的最佳解决方案。

我有两个问题:

1。我是否需要实现自己的着色器控制器/包装器(可能是低级别),我应该从哪里开始?

2。编译着色器是否有助于以某种方式提高参数设置性能?

也许有人知道如何解决这类问题/一些实现的着色器界面,或者可以就现代游戏引擎中如何解决这类问题提出一些建议。

谢谢。

3 个答案:

答案 0 :(得分:4)

  

实际几何渲染需要约35%并且后期处理 - 总渲染时间的5%

如果要分析着色器性能,则需要使用NVPerfHud或类似的东西。使用CPU分析器和测量刻度不会对您有所帮助 - 渲染通常是异步的。

  

我是否需要实现自己的着色器控制器/包装器(可能是低级别)

使用自己的着色器包装器并不是一个坏主意 - 我从来都不喜欢ID3DXEffect。 使用您自己的包装器,您可以完全控制资源和程序行为。 无论您是否需要,都可以由您决定。使用ID3DXEffect,您将无法保证实现速度尽可能快 - 它可能会浪费cpu周期来执行您不需要的操作。 D3DX库包含一些有用的类,但不保证有效(ID3DXEffect,ID3DXMesh,所有动画相关和皮肤相关的函数等)。

  

我应该从哪里开始?

DirectX 9上的D3DXAssembleShader,IDirect3DDevice9 :: CreateVertexShader,IDirect3DDevice9 :: CreatePixelShader,DirectX 10上的D3D10CompileShader。还下载DirectX SDK并阅读着色器文档/教程。

  

编译着色器是否有助于以某种方式提高参数设置性能?

加载时会自动编译着色器。您可以使用不同的优化设置编译尝试,但不要指望奇迹。

答案 1 :(得分:2)

您使用的是DirectX分析器还是只计时客户端代码?在客户端代码中使用计时器对DirectX API调用进行概要分析通常不是那么有效,因为它不一定会在您创建状态时同步处理状态更新/绘制调用。幕后有很多优化。这是关于DX9的这篇文章,但我确信这对于以后的版本没有改变:

http://msdn.microsoft.com/en-us/library/bb172234(VS.85).aspx

答案 2 :(得分:2)

  1. 我之前在DirectX中使用了效果,系统通常运行正常。它提供了一些很好的功能,可能很难在较低级别实现自己,所以我暂时坚持下去。

    正如bshields建议的那样,您的时间信息可能不准确。实际上,绘图实际上花费的时间实际上是相当的。

  2. 着色器在加载时编译。预编译将为您节省半秒的启动时间,但只要着色器在运行时没有更改,您就不会看到任何实际的速度增加。如果您仍在测试着色器,预编译也是一种痛苦。您可以使用最终副本完成此操作,但除非您有很多着色器,否则在加载时不会获得太多好处。

    如果您在每帧或每次渲染几何体时创建着色器,那可能就是问题所在。除非着色器本身(不是参数)每帧都改变,否则应该创建一次效果并重复使用。

    我不记得SetParameter调用的位置,但您可能需要检查文档以确保您的SetMatrix位于正确的位置。在传递开始后设置参数对任何事情都无济于事,当然也不会有所帮助。确保设置正确。此外,尽可能少地设置参数,涉及一些轻微的开销。如果你有太多,每帧设置会给你一个明显的减速。

  3. 总而言之,效果系统在大多数情况下都能正常工作,你不应该看到你的样子。确保您的分析正确无误,着色器有效且优化,并且您的呼叫位于正确的位置。