2016-03-24 25 views
0

Ich muss Tausende von 3D-Linien pro Sekunde für eine industrielle WPF-App zeichnen, aber WPF scheint keine native HW-beschleunigte Linienfunktion zu haben.Hardwarebeschleunigte 3D-Linien in WPF

Mit "3D" meine ich, dass sie in 3 Achsen gedreht werden können, in Perspektive usw. Durch "Linien" meine ich genau das - das sind keine Drahtgitter eines 3D-Objekts, also mache ich nicht wollen Tesselation einer 3D-Oberfläche und ich tun nicht wollen diese beleuchtet oder schattiert.

Variationen dieser Frage wurden zuvor in StackOverflow gestellt. Die Leute haben vorgeschlagen:

  • XNA, aber XNA ist
  • Helix3D veraltet, aber seine Linien seltsam, nicht akzeptabel Rendering-Artefakte
  • OpenGL (zB OpenTK oder SharpGL), aber ich habe viele Gespräche geführt mit Leute in den OpenGL-Foren und alle OpenGL-Schnittstellen mit WPF scheinen große Probleme mit anderen WPF-Funktionen zu haben und erfordern Hacks, um zu umgehen.

Ich denke, meine beste Wette ist DirectX oder Direct3D. Aber ich weiß nicht, wie ich sie mit WPF integrieren soll. Direct3D hat auch kein natives Linienprimitiv (es verwendet texturierte Dreiecke) siehe: https://msdn.microsoft.com/en-us/library/windows/desktop/bb323719%28v=vs.85%29.aspx

Wenn nötig, bin ich bereit, 2D hardwarebeschleunigte Linien zu machen und mein eigenes 3D-2D-Mapping zu machen.

Aber die Hauptsache ist, dass diese reibungslos mit WPF zu integrieren hat, so kann ich die Grafik mit einer transparenten WPF-Leinwand überlagert, auf das ich Marker zeichnen kann, Text, ROI usw.

Wie mache ich das?

Antwort

1

Direct3D kann native Einzelpixelzeilen mit oder ohne Beleuchtung mit oder ohne Textur-Bitmaps zeichnen. Was Direct3D nicht naiv zeichnen kann, sind "gestylte Linien" mit scharfen Kanten usw. Direct2D kann gestylte Linien entweder über emittierende Texturdreiecke oder mittels Software-Rasterung zeichnen.

Die deprecated D3DX9 Funktionalität für die Erstellung ‚gestylt Linien‘, die von den legacy Managed DirectX 1.1Microsoft.DirectX.Direct3D.Line Klasse verwendet texturierte Dreiecke verwendet wird, weshalb MSND dass erwähnt. Direct2D ist weit fortgeschritten und hat HW-Beschleunigungswege.

WPF stellt die D3DImage Klasse für Interop mit Direct3D, obwohl es Direct3D9/Direct3D9Ex unterstützt nur. Sie können DXGI-Surface-Tricks verwenden, um es mit DirectX 11 zu verwenden. Sehen Sie this article, die Ihnen zeigt, wie Sie es mit Direct3D 10 machen. Direct3D 11 ist das gleiche. Das WPFDXInterop Projekt auf GitHub sollte hilfreich sein, da es eine D3D11Image Klasse implementiert.

Für C# Interop von DirectX, die besten Optionen sind entweder SharpDX oder SlimDX.

+0

Gibt es in Direct3D9 die "Single-Pixel-Linien nativ mit oder ohne Beleuchtung mit oder ohne Textur-Bitmaps"? Wenn ja, gibt es einen Grund, nicht einfach D3DImage zu verwenden? Wenn WPF bereits eine D3DImage-Klasse hat, warum benötige ich SharpDX oder SlimDX? – user316117

+0

Gemäß [dieser] (http: // stackoverflow.com/questions/19480373/sharpdx-render-in-wpf) SharpDX ist veraltet. – user316117

+0

Lesen Sie es vorsichtiger: [SharpDX Tool Kit] (https://github.com/sharpdx/Toolkit) ist veraltet, nicht [SharpDX] (http://sharpdx.org/) selbst. SharpDX Tool Kit könnte für Sie nützlich sein, aber Sie können die SharpDX-Baugruppen direkt verwenden. –