2011-06-19 7 views
1

私が知る限り、オブジェクトまたはプリミティブを描画する前に毎回glColor4fなどを呼び出すのが一般的です。OpenGL:いつglLineWidth、glPointSize、glLineStyleを呼び出すべきですか?

しかしポイントとラインスタイルのプロパティはどうですか?

  • それは非常に頻繁にglLineSizeglPointSizeを呼び出すために正常ですか?

  • 現在のポイントサイズのバックアップを保存してから描画するか、デフォルトのサイズを使用する場合でも、ポイントを描画する前にglPointSizeと呼んでください。

+0

私はあなたがそれを使用する前にそれを呼び出すことを好むので、異なるサイズ、より少ないグラフィカルなバグを "漏らす"可能性はありません。私はそれが遅いかどうかは分かりませんが、あなたはいつもそれを把握することができると思います。しかし、間違いなくあなたは行を使う前にそれを呼び出すべきです。たとえば、ループ内に100万行を表示する場合は、ループの前に関数を呼び出します(サイズがループ内で変更されない場合)。 – Rookie

答えて

2

OpenGLはステートマシンなので、必要なときにステートを変更したり、変更するたびに状態を設定するという唯一の重要なルールです。一定の線幅が必要ですか?それを設定し、幅を完了してください。 1つのコードセグメントには、さまざまな線幅が必要です。線幅ごとにソートし、線幅ごとに1回設定します。

一部の州では、費用がかかりすぎますので、その状況を把握することをお勧めします。特に、問題の状態はテクスチャ結合(テクスチャユニットまたはFBOアタッチメント)とシェーダに関連するものです。他のすべては、実際にはかなり安価です。

一般に、OpenGL状態を明示的に設定することをお勧めします。これは、変換行列とセットアップにも適用されます。表示機能の開始時に完全なビューポートと投影設定を行います。高度なアプリケーションでは、それらのフレームを何度も変更する必要があります(つまり、再描画ハンドラではglViewport、glMatrixMode(GL_PROJECTION)はありません)。

+0

"一般的には、OpenGLの状態を明示的に設定し、特定の状態を以前からプリセットすることは想定しないことをお勧めします。私はパフォーマンスの観点からこれに同意しない。状態の変化を最小限に抑えることは、パフォーマンスには効果的です。うまく構成されたレンダリングエンジンは、主要な状態の変化をソートし、次のものをレンダリングするための最小限の変更回数を行います。これは前に来たことを前提としています。 –

+0

@Nicol Bolas:これは、OpenGL州の簿記に費やすCPU時間の間のトレードオフです。いくつかの変更は高価です。つまり、テクスチャの切り替え(キャッシュの無効化)とシェーダの切り替え、またはFBOの切り替えです。残りは通常非常に安いです。 OpenGLの状態変化を最適化することは、マイクロ最適化のもう一つの種類にすぎません。そして、1マイクロ秒ごとに問題がなければ、通常はマイクロ最適化を開始します。幅広いアルゴリズム最適化により、大幅なパフォーマンス向上が達成されます。 – datenwolf

+0

@datenwolfこれは、私が「あなたがプロファイルし、実際にパフォーマンスに重要であることを検証する」という答えに先行する理由です。だから私はこれがすでにボトルネックと認識されていると思っています。 –

1

数十万〜数十万の線を描画しない限り、実際には問題になりません。それでも、実際にパフォーマンスに重要な役割を果たすことをプロファイルし、検証する必要があります。しかし、あなたがそれをしたと仮定しよう。

状態変更の回数を最小限にするはパフォーマンスを向上させることができます。つまり、線のサイズとポイントごとのサイズで線をソートする必要があります。こうすることで、同じサイズの線を同時に描画することができます。もちろんこれは、あなたが任意の順序で線を引くことができることを前提としています。線を特定の順序で描画する必要がある場合は、状態の変化に合わせて生きなければなりません。

2

現在の線幅/ポイントサイズを決定するためにglGet **関数を使用しないでください。それは大きなパフォーマンスの犠牲者です。

代わりに、現在のプロパティlocalyを保存し、必要に応じて(推奨)、またはglPushAttrib(GL_LINE_BIT)/ glPopAttribを使用してください。

関連する問題