14

QML にベジエ曲線の実装例があるのを見てきましたが、破線または点線のベジエ曲線を実装する方法のヒントを探しています。私の知る限り、ベジエ曲線の例の作成者は、マテリアルを適用してQSGGeometryNode内部に保存するために使用しています。次に、ポイントのリストを作成し、それらの間にセグメントを描画するだけです。QSGGeometryQSGFlatColorMaterial

a を書いてshader適用することは可能ですか (行を、などQSGFlatColorMaterialとして表示する)?dasheddotted

QSGGeometry最終的に、内部に複数格納することは可能QSGGeometryNodeですか?

アップデート

QtQuickこれを「古い」インターフェース(のような)ではなく「純粋」に実装しQPainter etcたいと思います-コンテキスト(openGLとCPU)を切り替える何かを使用したくないためです。カスタム シェーダーを使用したソリューションを好みます (実行可能な場合)。カスタムのルック アンド フィール (破線、点線、色付き、アニメーションなど) を実装する可能性が高くなるからです。

それができない場合は、使用しますQPainter

4

5 に答える 5

5

このタスクは を使用して実装するのに適しているとは思いません。ベースの描画とQSGGeometryNodeを使用して実装する方がはるかに簡単です。OpenGLは GL 描画もサポートしており、ソフトウェアよりも高速であるため、OpenGL の利点は引き続き得られます。ストックを点線または破線のパターンで使用するか、シンプルなパターンで独自のものを作成できます。QPainterQQuickPaintedItemQPainterQPenQVector

別の方法として、Qt が提供するクラスを使用する代わりに、カスタム GL 描画アプローチを使用することもできます。これは、高度な複合ジオメトリを表現する場合にかなり制限されます。インスタンス化 (利用可能な場合) を使用してパフォーマンスをさらに向上させ、ダッシュまたはドット ジオメトリをパス カーブに沿って配置することもできます。

最後になりましたが、QML Canvas 要素を使用できます。これは、ほぼ同じ操作をサポートしQPainter、おそらく同じパフォーマンスを提供します。

編集: あなたの更新が示唆するように、QPainterソフトウェアと GL の両方で描画できると言った部分を見逃しており、GL 描画はしばしば大幅に高速です。また、GL コンテキストに描画することで、フレームバッファを CPU から GPU メモリに移動する必要がなくなり、GPU メモリに保持されます。したがって、オーバーヘッドはありません。QPainterアニメーションやその他のものに関しては、確かに、あなたが提供するものに制限されている場合は不可能ですQPen- 異なる結合、キャップなどを使用して形状をある程度変更することはできますが、奇跡はありません...シェーダーでも可能ですが、カスタム ジオメトリでのみ可能です。また、QObjectダッシュ/ドット要素ごとにベース オブジェクトを使用して、それらを個別にアニメーション化すると、非常に高価になります。QObject非常に重いので、軽い手では使用しないでください。そのため、FBO へのカスタム GL レンダリングは、そのような柔軟性が必要な場合に最適な方法ですが、QtQuick API から完全に GL ランドに移動する必要があります。

とにかく、破線シェーダーはそれほど複雑であってはなりません。基本的には、曲線からの距離とその長さに沿った「期間」に基づいてフラグメントに色を付けます。私はこの例を見つけましたが、自分で試したことはありません。しきい値をアニメートしたり、正弦関数を使用してファンキーなスタイルを作成したりすることもできます。

「純粋な」QtQuick 実装に関しては、API は実際にはそのようなタイプの描画タスクを処理するように設計されていません。そのため、ギャップを埋めて QML/JS から高度なペインティング機能を取得するために Canvas 要素が提供されました。Canvas は事実QPainter上、FBO に描画するラッパーです。

結局のところ、何が可能か不可能かということにはなりませんが、どのアプローチが最も理にかなっていて、仕事を成し遂げるのに最も効率的かということになります。パフォーマンスQQuickPaintedItemに満足できない場合は、別のより複雑なソリューションを実装し、最初のソリューションに対してプロファイルを作成することができます。結局のところ、それが最初に導入された理由です-クラスQQuickPaintedItemで行うには不便なレガシーペインティングを処理するためです。QQuickItem

于 2013-08-26T15:04:30.423 に答える
0

いいえ、ジオメトリ ノードに複数のジオメトリを格納することはできません。API はそれについて非常に明示的です。ノードはジオメトリとマテリアルをペアにするため、そこに複数のジオメトリを保存する理由はありません。ノード間でジオメトリとマテリアルを再利用できます。実際、これが意図された使用方法です。

質問の残りの部分は完全ではありません。シェーダーベースの実装が提供されたとしても、最初はあまり役に立ちません。それは時期尚早の最適化にすぎません。不足しているものを見てみましょう。

BezierCurve 項目の例は、概念実証にすぎません。同じペンを使用してストロークされる複数のアイテムをチェーンする方法が必要なため、それ自体では役に立ちません。シンプルなものに似たものが必要ですQPainterPathQPainterPath実際、ジオメトリ自体はおよびによって生成できますQPainterPathStroker

連続ストローク アイテムのテッセレートされた完全なジオメトリを取得したら、線のスタイルに基づいてさらにカットするか、シェーダーを使用することができます。ライン スタイル シェーダー自体が大きなメリットであることを示すには、プロファイリングが必要です。ストロークなどを行うためにジオメトリ シェーダーが必要な場合があり、すべてのパフォーマンスの向上はそこに集中します。実行する計算の数を考えてみてください。ラインのスタイリングは比較的単純です。

于 2013-08-27T04:18:18.800 に答える