問題タブ [vbo]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
debugging - VBO Vertex バッファのデバッグがクラッシュする
頂点、法線、およびカラー バッファー (glBindBufferARB) を格納するために VBO 拡張機能を使用しています。何らかの理由で、バッファーを変更したり、何らかの操作を行ったりすると、アプリケーションがアクセス違反でクラッシュします。デバッガーをアタッチすると、nvidia グラフィックス ドライバーに関連する dll で実行される opengl 呼び出しを実行するメイン スレッドではないスレッドでクラッシュが発生することがわかります。
おそらく発生したのは、一部のバッファー呼び出しに不適切なバッファーまたは間違ったサイズを指定したことです。私の質問は、この状況をどのようにデバッグするのですか? クラッシュは、実際の呼び出しの後、別のスレッドで発生したようです。
opengl-es - OpenGL ES 1.x で頂点バッファー オブジェクトを使用する場合、インデックス付きプリミティブを使用できますか?
頂点バッファー オブジェクトを使用して GPU にコピーする頂点のリストを含む配列があります。ただし、頂点配列へのインデックスのリストを含む整数配列もあるため、頂点座標自体は無意味です。
このシナリオでは、別のバッファ オブジェクトを作成してインデックスを格納し、レンダリング関数で頂点配列とインデックス配列の両方を描画用にバインドすることができます。
私はAPIを読み、次のことで混乱しました:
「ゼロ以外のバッファオブジェクトがGL_ELEMENT_ARRAY_BUFFERターゲットにバインドされている間、伝統的にクライアント側メモリへのポインタとして解釈されるglDrawElementsのインデックスパラメータは、代わりに内部のオフセットとして解釈されます基本マシン単位で測定されたバッファ オブジェクトです。」
私はグラフィックプログラミングにかなり慣れていないので、これが意味をなさない場合は申し訳ありません.
java - 頂点バッファ オブジェクトのテクスチャリング
私がやりたいのは、OpenGL で (大きな) 地形を描くことです。だから私は頂点のセットを持っています.VRAMの頂点バッファオブジェクトに保存する256 x 256としましょう。それらを適切に三角測量したので、顔のインデックス バッファーを取得しました。
また、各三角形に適用する必要がある正方形のテクスチャもロードしました。だから私はテクスチャ座標に問題があります:
各頂点は 4 つの三角形に含まれています。つまり、4 つのテクスチャ座標が必要です。ただし、glDrawRangeElements() には頂点と同じ数のテクスチャ座標が必要です。
したがって、VBOでこれを行う方法がわかりません。私の問題を解決するためのより良いコンセプトがあるか、良いアイデアが欠けているだけかもしれません。
前もって感謝します。
performance - VBO が「単純な」OpenGL プリミティブ (glBegin()) よりも速いのはいつですか?
Vertex Buffer Objects (VBO) について何年も聞いた後、最終的にそれらを試してみることにしました (私のものは通常、パフォーマンスが重要ではないことは明らかです...)
以下で私の実験について説明しますが、簡単に言うと、「単純な」ダイレクト モード (glBegin()/glEnd())、頂点配列 (CPU 側)、および VBO (GPU 側) の間で見分けがつかないパフォーマンスが見られます。レンダリング モード。これがなぜなのか、どのような条件下で、VBO が原始的な (しゃれを意図した) 先祖よりもはるかに優れていると期待できるかを理解しようとしています。
実験の詳細
実験のために、多数のポイントからなる (静的) 3D ガウス クラウドを生成しました。各ポイントには、それに関連付けられた頂点と色の情報があります。次に、一連のフレームでカメラを雲の周りで「周回」動作のように回転させました。繰り返しますが、ポイントは静的で、目だけが動きます (gluLookAt() を介して)。データは、レンダリングの前に 1 回生成され、レンダリング ループで使用するために 2 つの配列に格納されます。
直接レンダリングの場合、データセット全体が単一の glBegin()/glEnd() ブロックでレンダリングされ、ループには glColor3fv() と glVertex3fv() への単一の呼び出しが含まれます。
頂点配列と VBO レンダリングの場合、データ セット全体が単一の glDrawArrays() 呼び出しでレンダリングされます。
次に、タイトなループで 1 分程度実行し、高性能タイマーで平均 FPS を測定します。
パフォーマンス結果 ##
前述のように、デスクトップ マシン (XP x64、8 GB RAM、512 MB Quadro 1700) とラップトップ (XP32、4 GB RAM、256 MB Quadro NVS 110) の両方でパフォーマンスに違いはありませんでした。ただし、ポイント数で予想どおりにスケーリングしました。明らかに、vsync も無効にしました。
ラップトップの実行からの特定の結果 (GL_POINTS を使用したレンダリング):
glBegin()/glEnd():
- 1K ポイント --> 603 FPS
- 10K ポイント --> 401 FPS
- 100K ポイント --> 97 FPS
- 1M ポイント --> 14 FPS
頂点配列 (CPU 側):
- 1K ポイント --> 603 FPS
- 10K ポイント --> 402 FPS
- 100K ポイント --> 97 FPS
- 1M ポイント --> 14 FPS
頂点バッファ オブジェクト (GPU 側):
- 1K ポイント --> 604 FPS
- 10K ポイント --> 399 FPS
- 100K ポイント --> 95 FPS
- 1M ポイント --> 14 FPS
GL_TRIANGLE_STRIP を使用して同じデータをレンダリングしたところ、同様に見分けがつきませんでした (ただし、追加のラスタライズにより予想どおり遅くなりました)。誰かがそれらを望むなら、私もそれらの番号を投稿できます. .
質問
- 何を与える?
- VBO の約束されたパフォーマンスの向上を実現するには、何をしなければなりませんか?
- 私は何が欠けていますか?
opengl - OpenGL:ジオメトリのバッチをレンダリングする効率的な方法は?
これは私がしばらく調べていたものですが、具体的な情報や良い例はまだ見つかりません. たとえば、接続されていないオブジェクトがたくさんあります (たとえば、三角形のストリップ)。これらをレンダリングする効率的な方法は何ですか?
openGL 呼び出しを減らすために複数のオブジェクトを 1 つの VBO に入れることについて聞いたことがありますが、これを行う方法の適切な例を見たことがありません。この考えに反する投稿も見ました。だから今、私はほとんど混乱しています。
c++ - OpenGLのVBOの使用に関する問題
VBOを使用して、最初のレッドブックの例(白いクワッド)をレンダリングしようとしました。
イミディエイトモードと頂点配列で正常に動作します。
ただし、VBOを使用すると、画面が真っ暗になります。私は何か重要なことを見逃したに違いないと思います。
初期化:
VBOのrenderloop(機能していません):
頂点配列のrenderloop(動作中):
opengl - 頂点バッファ オブジェクトを使用して多くの異なる円をレンダリングするにはどうすればよいですか?
私は多くのサークルを扱うゲームを書こうとしています (まあ、トライアングル ファンですが、アイデアはわかります)。各円には、x 位置、y 位置、および質量特性があります。すべての円の質量特性は異なります。また、透明な円の中心を維持し、円の周囲に沿って不透明にフェードしながら、いくつかの円のグループを異なる色にしたいと考えています。
私は VBO を使用するように言われ、一日中 Google を使っていました。これらの円をどのように描くかについての完全な例と、VBO がどのように機能するかについての説明を、その説明を簡単に保ちながらお願いします。
c - OpenGL 3.x VBOを使用して動的な世界をレンダリングするにはどうすればよいですか?
OpenGL 3.x自体の最新のリファレンスはほとんどないようですが、OpenGLの実際の低レベルの操作は比較的簡単です。しかし、ダイナミックな世界をレンダリングするためにVBOを操作する方法を概念化しようとしても、深刻な問題を抱えています。
明らかに、古い即時モードの方法は適用できませんが、そこからどこに行きますか?ある種のシーン構造を記述し、それを頂点のセットに変換してVBOにストリーミングしますか?翻訳データをどのように保存しますか?もしそうなら、それはコード的にどのように見えるでしょうか?
基本的に、続行する方法が本当にわかりません。
opengl - OpenGLVBOと色の管理
描画にVBOを使用するアプリを作成しています。アプリは複数の色の線分を描画します。したがって、色ごとに頂点とインデックスの配列を作成し、セグメントを色ごとに適切な配列に並べ替えています。
ただし、ユーザーが任意の線分の色を設定できるようにしたいと思います。したがって、私の潜在的な色の数は事実上無制限です(明らかに実際にはそうではありませんが、そうなる可能性もあります)。1,000色をサポートするために1,000個の頂点配列とインデックス配列を保持するために2,000個のVBOを生成することは、良いことではないと思います。
明らかに、新しい色の頂点配列を描画するたびに、限られた数のVBOを生成し、新しいデータをコピーすることができますが、それは非常に非効率的です。
この状況に対処するための提案はありますか?
iphone - モデルビューマトリックスを変更する場合でも、頂点バッファオブジェクトを使用することは理にかなっていますか?
iPhoneアプリでパフォーマンス(FPS)をさらに向上させたいと思っています。私はすでにインターリーブされたデータ、GL_SHORT、および単一のテクスチャアトラスを使用しています。私がすでに行ったことの詳細については、この質問を参照してください。
次に、VBOを使用してパフォーマンスを向上させる方法を検討します。AppleのOpenGLESのドキュメントによると、これは実行するのに適したステップです。ただし、モデルビューマトリックスの変更によってVBOがどのように影響を受けるか(または影響を受けるかどうか)については説明していません。基本的に、同じオブジェクトをシーンに複数回レンダリングしますが、毎回わずかに異なるモデルビューマトリックスを使用します。オブジェクト間の主な違い(シーン内の位置以外)は、テクスチャマッピングです。それらはすべてわずかに異なるテクスチャ座標を持っています。
VBOはこの状況で役立ちますか?個々のオブジェクトごとに個別のVBOを割り当てる必要がありますか?
アップデート1
これまでのところ、VBOは私のパフォーマンスに悪影響を及ぼしているようです。FPSは20代半ばから高値に戻りました。私は70のVBOを割り当てています。データ用に35、インデックス用に35です。データと1つのグローバルインデックス配列に対してこれを35にノックダウンできます。glBufferSubData()を使用して、必要に応じてテクスチャ座標を更新しています。
もう1つの考えは、すべての静的データを分割し、そのVBOにGL_STATIC_DRAWを指定することです。