問題タブ [vertex-buffer]
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.
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 の約束されたパフォーマンスの向上を実現するには、何をしなければなりませんか?
- 私は何が欠けていますか?
c++ - インターリーブされたバッファを持つopenGLglDrawElements
これまでのところ、glDrawArraysのみを使用しており、インデックスバッファーとインデックス付き三角形の使用に移りたいと思います。テクスチャ座標、法線、頂点座標を使用して、やや複雑なオブジェクトを描画しています。このすべてのデータは、単一のインターリーブされた頂点バッファーに収集され、次のような呼び出しを使用して描画されます(すべてのserupが正しく実行されたと仮定)。
これにより、m_indexDataを、標準の位置インデックス配列だけでなく、法線とテクスチャ座標のインデックスとインターリーブすることもできますか?または、頂点形式全体(POS、NOR、TEX)に適用される単一の線形リストを想定していますか?後者が当てはまる場合、異なるテクスチャ座標または法線を使用して同じ頂点をレンダリングするにはどうすればよいですか?
この質問は次のように言い換えることもできると思います。3つの個別のインデックス付きリスト(POS、NOR、TEX)があり、後者の2つを再配置して最初のリストと同じインデックスリストを共有できない場合、それをレンダリングする最良の方法は何ですか。
opengl - OpenGL頂点レイアウト
問題は次のようになります。位置(3つのフロート)のみで定義された頂点構造があり、合計サイズが12バイトの場合、問題は完全に機能します。ただし、位置コンポーネントに符号なしバイトまたはショート(頂点あたり3または6バイト)を使用しようとすると、glDrawArraysでのアクセス違反でクラッシュします。なぜですか?
c++ - 1つの頂点バッファに複数のメッシュがありますか?
メッシュごとに1つの頂点バッファーを使用する必要がありますか、それとも1つの頂点バッファーに複数のメッシュを格納できますか?もしそうなら、私はそれをすべきですか、そして私はそれをどのように行うでしょうか?
c++ - 頂点バッファオブジェクトを使用して、さまざまな三角形タイプと三角形ファンをレンダリングしますか?(OpenGL)
メッシュの約半分は三角形を使用しており、残りの半分は三角形ファンを使用しています。これらを頂点バッファオブジェクトにオフロードしたいのですが、これを行う方法がよくわかりません。三角形のファンはすべて異なる数の頂点を持っています...たとえば、1つには5つ、もう1つには7つある場合があります。
VBOは、単純な三角形を使用するとかなり簡単ですが、三角形のファンやさまざまな三角形の種類でVBOを使用する方法がわかりません。インデックスバッファが必要だとはかなり確信していますが、これを行うために何が必要かはよくわかりません。
実行時に各ファンを構成する頂点の数を知っています...それを使用して次のようなものを呼び出すことができると思いますglArrayElement
ここでの助けは大歓迎です!
opengl-es - 法線レンダリングを使用した OpenGL ES ポリゴン (「ES!」に注意してください)
わかりました... 6 つの異なる法線を持つ比較的単純なソリッドがあるとしますが、実際には 48 面 (方向ごとに 8 面) 近くの面があり、面間に多くの共有頂点があるとします。OpenGLでそれをレンダリングする最も効率的な方法は何ですか?
頂点を配列に配置し、インデックス配列を使用してそれらをレンダリングできることはわかっていますが、法線を変更するには、レンダリング手順を分割し続ける必要があります (つまり、法線 1 を設定... 8 つの面をレンダリング... 法線を設定) 2... 8 つの面をレンダリングするなど) そのため、インデックス配列の配列を維持する必要があります...法線ごとに 1 つです! 良くない!
別の法線配列と頂点配列を使用する (またはそれらをインターリーブする) こともできますが、これは、法線と頂点の比率を 1 対 1 にする必要があることを意味し、法線が 8 倍以上複製されることを意味します。必要以上に!球面または曲面のあるものでは、すべての法線が異なる可能性が最も高いですが、これについては、メモリの無駄のように思えます.
完璧な世界では、頂点と法線配列の長さが異なるようにしたいので、三角形または四角形を描画するときに、その頂点の各配列へのインデックスを指定します。
OBJ ファイル形式では、正確にそれを指定できます... 頂点配列と異なる長さの法線配列を指定すると、レンダリングする面を指定するときに、頂点と法線インデックス (および場合は UV 座標) を指定します。あなたもテクスチャを使用しています)これは完璧なソリューションのようです! 48 個の頂点がありますが、法線は 8 個しかありません。次に、シェイプの面を定義するインデックスのペアです。しかし、OpenGL ES でそれをレンダリングする方法がわかりません (繰り返しますが、'ES' に注意してください)。現在、法線を 1 対 1 に戻す必要があります頂点配列、次にレンダリングします。記憶を無駄にするだけです。
誰か助けて?ここで非常に単純なものが欠けていることを願っています。
マーク
c++ - glDrawArrays() を使用しているときにすべての頂点をレンダリングするために VBO の長さを取得するにはどうすればよいですか?
関数で VBO を作成し、VBO ID のみを返したいと考えています。
別の関数で glDrawArrays を使用し、頂点の数を渡す必要なく、VBO 内のすべての頂点を描画する必要があります。VBO には、テクスチャ座標データも含まれています。
ありがとうございました。
c++ - C++ での OpenGL 頂点バッファーの使用
Wavefront .obj ファイルを読み込んでイミディエイト モードで描画したところ、正常に動作しました。
同じモデルを頂点バッファで描画しようとしていますが、質問があります。
私のモデルデータは、次の構造で編成されています。
現在のところ、複数の面構造が同じ頂点、法線、またはテクスチャ座標を指すことができるため、冗長なデータはないと思います。
頂点位置、法線、およびテクスチャ座標の vbo を作成し、glBufferData を使用してそれらにデータを割り当てる場合、それらがすべて同じ順序で同じ数の要素を持つように、冗長データを含む配列を作成する必要がありますか? モデルのデータを整理した方法でバッファを埋める簡単な方法があるかどうかを知りたいです。