3
DirectXで太さを変えながら、AAでラインをレンダリングする最速の方法
そのため、正確には.NETでSharpDXを使用してDirectX開発を行っています(ただし、DirectX / C ++ APIソリューションは適用可能です)。DirectXを使用して、直交投影で線をレンダリングする最速の方法を探しています(たとえば、科学アプリの2D線画のシミュレーション)。 私がレンダリングしようとしているプロットの種類のスクリーンショットは次のとおりです。 これらの種類のプロットでは、ラインごとにアンチエイリアシング(またはフルスクリーンAAのオン/オフ)の有無に関係なく、数百万のセグメントがあり、太さが変化するラインを持つことは珍しくありません。ラインの頂点を非常に頻繁に(たとえば、20回/秒)更新し、可能な限りGPUにオフロードする必要があります。 これまで私は試しました: ソフトウェアレンダリング、たとえばGDI +は実際にはパフォーマンスの低下ではありませんが、明らかにCPUに負荷がかかります Direct2D API-GDIよりも遅く、特にアンチエイリアスがオンの場合 この方法を使用するDirect3D10 は、CPU側で頂点カラーとテッセレーションを使用してAAをエミュレートします。また遅い(プロファイルを作成し、頂点位置の計算に時間の80%が費やされる) 3番目の方法では、頂点バッファーを使用して三角形のストリップをGPUに送信し、200ミリ秒ごとに新しい頂点を更新します。100,000ラインセグメントのリフレッシュレートは約5FPSです。理想的には数百万人が必要です! 今、私は最速の方法は、GPU、例えばジオメトリシェーダーでテッセレーションを行うことだと考えています。頂点をラインリストとして送信するか、テクスチャでパックし、ジオメトリシェーダーでアンパックしてクワッドを作成できます。または、生のポイントをピクセルシェーダーに送信し、ブレゼンハムライン描画を完全にピクセルシェーダーで実装します。私のHLSLは2006年のさびたシェーダーモデル2であるため、最新のGPUが実行できるクレイジーな機能については知りません。 質問は次のとおりです。-誰もこれを以前にやったことがありますか、試してみる提案はありますか?-ジオメトリをすばやく更新してパフォーマンスを改善するための提案はありますか(たとえば、20msごとの新しい頂点リスト)。 1月21日更新 それ以来、LineStripおよびDynamic Vertex Buffersを使用するGeometryシェーダーを使用して、上記のメソッド(3)を実装しました。現在、10万ポイントで100FPS、1,000,000ポイントで10FPSを取得しています。これは大きな改善ですが、今ではフィルレートと計算が制限されているため、他の手法やアイデアについて考えました。 ラインセグメントジオメトリのハードウェアインスタンス化はどうですか? Sprite Batchはどうですか? 他の(ピクセルシェーダー)指向のメソッドはどうですか? GPUまたはCPUで効率的にカリングできますか? あなたのコメントと提案は大歓迎です!