最新のOpenGLでレンダリングするためにデバッグプリミティブをバッチ処理する必要がありますか?


7

最近、いくつかの古いレンダリングデモを最新のOpenGLに移植し始めました。三角形、立方体、球などのデバッグオブジェクトをレンダリングするために、即時モードglBegin()、glEnd()などを使用する古いコードにデバッグ描画クラスがありました。

もともと私はこれらの関数のコードを、VAOとVBO(位置と色)を生成し、バインドし、頂点データを割り当て、レンダリングし、VBOとVAOを無効にして削除するコードに置き換えました。これに問題はありますか?

私はクラスを変更して、描画プリミティブ呼び出しを取得するたびにVAOとVBOを生成し、頂点データを割り当てますが、他のすべてのレンダリングが完了するまで実際にはレンダリングを行わないように考えています。次に、一度に保存されたすべてのデバッグプリムをレンダリングします。

私はこれを行う方法のどちらの利点があるのか​​わからず、人々が何を考えているのかと思っていました。

回答:


7

デバッグ描画を行う場合、パフォーマンスは本当に最大の関心事ではありません。それを機能させることははるかに重要です。結局のところ、このビルドビルドはリリースビルドで使用しないので、何が問題なのでしょうか。

ただし、1つの方法に関心がある場合は、このバッファーオブジェクトストリーミングに関するページで、手動で生成された頂点データのパフォーマンスを向上させる方法を提案します。「バッファの更新」メソッドに特に注意してください。


1

即時モードとVBOのどちらを使用するかは、シーンの複雑さに依存します。接線/法線がイミディエイトモードを使用して描画される例をいくつか見ました。

デバッグにVBOを使用することに問題はありません。ただし、一般的に言って、バッチ処理を使用すると、使用する方法に関係なくパフォーマンスが向上するので、可能な限り常に使用するようにしてください。状態変更の数が大幅に削減されるため、イミディエイトモードでバッチ処理することで多くのメリットが得られます(おそらくそれ以上)。適切にバッチ処理されている場合、必要なのは1つのGlBegin()とGlEnd()だけであり、すべての同様のデータが密にグループ化されています。唯一の違いは、頂点データの代わりに状態呼び出しをバッチ処理することです。


3
イミディエイトモードは廃止されているため、まったく使用したくありません。即時モードを置き換えたので、DrawDebugCube()を呼び出すと、頂点バッファーが作成され、データが入力され、レンダリングされてから削除されます。私がやろうとしていることは、DrawDebugCube()にバッファを作成してそこにデータを投入させることです。次に、バッファリングされたすべてのデバッグプリムが一度にすべてレンダリングされます。
user10329
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.