因此,我正在做一些DirectX开发,确切地说是在.NET下使用SharpDX(但DirectX / C ++ API解决方案适用)。我正在寻找使用DirectX在正交投影中渲染线的最快方法(例如,模拟科学应用程序的2D线图)。
我尝试渲染的各种情节的屏幕截图如下:
这类绘图具有数百万个线段,可变厚度,是否带有每行抗锯齿(或全屏AA开/关)的情况并不少见。我需要非常频繁地更新线条的顶点(例如20次/秒),并尽可能多地卸载GPU。
到目前为止,我已经尝试过:
- 软件渲染(例如GDI +)的性能实际上并不差,但显然在CPU上很沉重
- Direct2D API-比GDI慢,尤其是在启用抗锯齿功能时
- Direct3D10使用此方法在CPU端使用顶点颜色和细分来模拟AA。也很慢(我分析了它,花费了80%的时间用于计算顶点位置)
对于第三种方法,我使用“顶点缓冲区”将三角带发送到GPU,并每200毫秒用新顶点更新一次。100,000个线段的刷新率约为5FPS。我理想地需要数百万!
现在,我在想最快的方法是在GPU上进行细分,例如在Geometry Shader中。我可以将顶点作为线列表发送,也可以打包成纹理,然后在“几何着色器”中解包以创建四边形。或者,只需将原始点发送到像素着色器,然后在像素着色器中完全实现Bresenham Line绘图。我的HLSL是2006年的生锈着色器模型2,所以我不了解现代GPU可以完成的疯狂工作。
所以问题是:-有人做过吗,您有什么建议可以尝试吗?-您对通过快速更新几何来提高性能有什么建议(例如,每20毫秒创建一个新的顶点列表)?
1月21日更新
从那以后,我已经使用LineStrip和Dynamic Vertex Buffers使用Geometry Shader实现了上述方法(3)。现在我以100k点获得100FPS,以1,000,000点获得10FPS。这是一个巨大的改进,但是现在我的填充率和计算能力受到限制,因此我开始考虑其他技术/想法。
- 线段几何的硬件实例化如何?
- Sprite Batch呢?
- 其他面向(像素着色器)的方法呢?
- 我可以有效地淘汰GPU或CPU吗?
您的意见和建议深表感谢!