3

WebGL を使用して GLPoints として巨大な点群 (150 万点) をレンダリングしていますが、当然パフォーマンスの問題が発生します。

したがって、私の最初のアイデアは、画面に描画されるポイントの量を制限することです。特にカメラから離れたポイントは「役に立たない」ため、レンダリングしないでください。

任意の点とカメラの間の距離を計算することでそれを実現しました。私の頂点シェーダーでは、カメラに十分「近い」ポイントのみをレンダリングしたいと考えています。これまでのところ、距離 "s" がカメラとクリッピング プレーンの間にある場合 (したがって負の場合)、それらをスキップしようとします。

if( s < 0.0){
  gl_Position = vec4(0.0, 0.0, 0.0, 0.0);
  frontColor = vec4(0.0, 0.0, 0.0, 1.0);
  gl_PointSize = 0.0;
}else{
  gl_Position = ps_ProjectionMatrix * ecPos4;
}

ただし、表示された FPS からわかるように、頂点を完全にスキップする代わりに (見えなくても) レンダリングされます。頂点シェーダー内の頂点を完全に無効化/スキップ/「削除」する方法はありますか?


フラスタム カリングがスピードアップにどのように役立つかがわかります。明確にするために、いつ淘汰を行うべきですか?カメラが動くたびにカリングを再計算する必要があるため、メインループに入れる必要がありますか? しかし、1 Mio をやっています。レンダー ループでの計算はあまり良い考えではないようです。

カメラがポイントとはまったく異なる方向に見えると、これらは WebGl/ハードウェアによって自動的にクリップされる必要があることを正しく理解していますか? それでも、「目をそらす」ことは役に立たない気がします。(FPSが上がらなかった) 誰かもう少し詳しく説明してくれませんか!

私が使用するエンジンには、デフォルトの透視投影マトリックスがあります。明らかに、すべての頂点の座標に影響します。射影行列は自動​​クリッピングとどのように関連していますか?

4

2 に答える 2

2

投影行列を微調整する必要があるように思えます。これにより、視錐台が遠すぎて画像に意味のある影響を与えないポイントを除外できます。lighthouse3d のこのチュートリアルでは、視錐台について説明し、視錐台ベースのカリングをソフトウェアで実装する方法について説明します。射影行列を適切に設定していれば、OpenGL が自動的に実行するため、これは必要ないことに注意してください。

于 2011-11-10T21:22:54.357 に答える
1

まず、ないです。頂点を完全に破棄することはできません。2 つの頂点からなる三角形は (3 番目の頂点を破棄した場合) はどうなるでしょうか? ジオメトリ シェーダーを使用してプリミティブごとに行うこともできますが、それは WebGL ではサポートされていないことです。ポイント プリミティブのみを描画した場合でも、頂点シェーダーにはまだプリミティブの概念がなく、頂点を破棄することはできません。

できることは、頂点を表示ボリュームの外に移動することです。この方法では切り取られ、ラスタライズ (サイズ 1 のポイントを使用する場合はそれほどコストがかからない) やフラグメント シェーダーの費用はかからず、頂点シェーダーにのみ支払う必要があります。

現時点でやりたいことのように思えますが、実際には、頂点の w 座標を 0 に設定することはお勧めできません。これにより、遠近分割中に未定義の動作が発生します。正規のビュー ボリューム ([-1,1] キューブ) の外側に設定するだけです。

if( s < 0.0 )
    gl_Position = vec4(2.0, 0.0, 0.0, 1.0);
else
    gl_Position = ps_ProjectionMatrix * ecPos4;

また、いじる必要はありませんgl_PointSize。表示ボリュームの外側に位置を設定するだけで十分です。

編集:しかし、あなたの場合、ジェームズの答えからの解決策ははるかに簡単です。射影行列の遠平面を変更するだけです。そのタスクは、遠すぎるオブジェクトを正確に切り取ることです。

于 2011-11-10T21:24:29.047 に答える