問題タブ [vertex-array-object]
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 - 頂点配列の問題
VBO (VertexBufferObjects) の処理方法を学習しようとしていますが、Vertex Arrays よりも先に進むことができません。このトピックに関するいくつかの基本的なチュートリアルに従いましたが、それぞれが異なる方法を教えていたため、理解して実装するのが難しくなりました.
問題: でのレンダリングglDrawArrays();
は、即時モードでのレンダリングと同じように機能するはずです。そのため、 songho.caでコードをテストしようとしましたが、ネイティブ コード内で JVM がクラッシュするだけです。このメソッドには数十のバリエーションがあるため、Google に尋ねてもまったく役に立ちませんでした。しかし、私のパラメーターが主な問題であると思います。
これが私がこれまでに得たものです:
私は LWJGL を使用しているので、データを FloatBuffer に格納しています。
私の Triangle クラスは 3 つのベクトル ABC で構成され、それぞれが 1 つの頂点を定義します。最初の行では、三角形ごとに 9 つのフロート (頂点ごとに 3 つのフロート、三角形ごとに 3 つの頂点) の頂点にスペースを割り当てています。これまでのところ異常なことは何もありません。バッファ内に配置されたフロートの量は、割り当てられたサイズとまったく同じです。
即時モードでのレンダリング:
特別なことは何もありません。これまでに見たものはすべて、私にとってはうまくいきます。しかし、Array バリアントは頭痛の種です...
クラッシュしている JVM によって生成されたエラーログはglDrawArrays(GL_TRIANGLES, 0, buffer.capacity());
行を指していますが、間違いが見つかりません...
opengl - Haskell opengl 属性がアクティブではありません
頂点バッファ オブジェクトからいくつかのデータをレンダリングしようとしています。ただし、 glutil と raw をほとんど使用していません。プログラムを実行すると、無限ループに陥り、下に表示されているエラーが発生します。
頂点シェーダー
フラグメントシェーダー
430 を使用してみましたが、うまくいきませんでした。ということで、150を使っている人が多かったので使ってみました。さらに、生を使用しながらレイアウトを使用しようとしましたが、うまくいきませんでした。
使用例
エラー
c++ - glBindVertexArray(vao) の呼び出し: 'vao' が既にバインドされている場合はどうなりますか? それに応じて形状クラスを設計する方法は?
私は OpenGL をもう一度試していますが、後でレンダリングされるクラスをどのように設計するのか疑問に思っています。現在、形状は 1 種類しかないため、 の最初のインスタンスが作成されたときに呼び出されるShape
静的な VAO メンバーを持つクラスを作成しました。今、方法があります:glGenVertexArrays(1, &vao)
Shape
void Shape::render()
これは良い方法ですか?つまり、実際のプログラムでのすべてのインスタンスShape
が描画されると、 bind が繰り返し呼び出されますが、現在既にバインドされているShape::vao
場合、実際には何もしないと思います。vao
その推測は正しいですか?
glBindVertexArray(0)
また、の最後にを呼び出すチュートリアルを少し前に見ましたrender()
。多くの形状がある場合、パフォーマンスが低下する可能性はありませんか?
c++ - インデックス付きの三角形を使用した削減された頂点バッファー
私の OpenGL プログラムには、2048x2048 ポイントのデータ (法線、位置、texcoords) を含む巨大な頂点バッファーがあります。各フレームで、LOD アルゴリズムを使用してインデックス付きバッファーを減らし、GL_ELEMENT_ARRAY_BUFFER を再度バインドします。
インデックス バッファーから使用された頂点のみが含まれるように、頂点バッファーもさらに削減することが理にかなっているのだろうかと思います。したがって、問題は、フレームごとに頂点配列を再構築および再バインドしてもパフォーマンスが向上するかどうかです。
java - LWJGL を使用する Java で配列バッファを使用してレンダリングできない
頂点配列/頂点バッファー オブジェクトを使用して、OpenGL で最新の方法でプログラミングする方法を学ぼうとしています。現在、LWJGL wiki のチュートリアルを使用しています。チュートリアル コードをコピーして貼り付けても、背景色が適切に設定されたウィンドウが表示されますが、その上に形状がレンダリングされません。チュートリアル ページには、背景の上に白い四角形がレンダリングされたスクリーンショットが表示されます。これは一般的な問題ですか、それともエラーに関する詳細情報を取得する方法はありますか?
編集:シェーダーを使用して頂点に色を付けると、問題が解決します。ただし、チュートリアルコードはシェーダーを使用せずに機能することを意図していると想定しているため、これはまだ回答として投稿していません。(チュートリアルの後半にあります)
これは、チュートリアル ページのコードです。
performance - パフォーマンスを考慮しながら、最新の OpenGL でデータを適切に管理するにはどうすればよいですか?
最新の OpenGL (3.x+) では、位置、色、法線、テクスチャ座標、およびインデックスなどの頂点属性を含むバッファー オブジェクトを作成します。
次に、これらのバッファーは、対応する頂点配列オブジェクト (VAO)に割り当てられます。VAO には、基本的にすべてのデータとデータの形式へのポインターが含まれています。
VAO の作成方法と使用方法については、多くのチュートリアルがあります。残念ながら、大規模なアプリケーションやゲームで VAO をどのように使用すべきかは明確ではありません。
たとえば、ゲームには多くの 3D モデルが含まれる場合があり、各モデルを異なる VAO で分離することが適切と思われます。
一方、パーティクル システムには、互いに独立して移動する多くの切断されたプリミティブが含まれています。このシナリオでは、システムごとに 1 つの VAO を使用すると、CPU-GPU 転送のパフォーマンスが向上する可能性があります。ただし、この場合、プリミティブは互いに異なる方法で変換する必要があるため、各パーティクルを非常に小さな VAO に分離することが実行可能に見えるかもしれません。
質問:
- 大量の小さなデータ セット (クワッドのパーティクル システムなど) の場合、すべてのデータを 1 つの VAO にパックするか、多数の VAO に分割する必要がありますか? 各方法のパフォーマンスの利点/欠点は何ですか?
1 つの VAO が使用されると仮定すると、データの独立した各サブユニットを変換する唯一の明らかな方法は、実際の位置情報を変更して GPU に再ロードすることです。これを何度も行うと、時間パフォーマンスの点でコストがかかります。
多くの VAO が使用されていると仮定すると、GPU は各 VAO の重複したフォーマット情報を保存する必要があります。これはスペースの点でコストがかかるようです (ただし、これが必ずしも遅いかどうかはわかりません)。
補足:
はい、私は個人的に粒子システムの管理に興味があります。この質問をより一般的なものにし、他の人にとってより役立つようにするために、VAO 管理全体について質問しています。保存するデータの種類と、求められるパフォーマンスの種類 (時間/空間) を考えるとき、どのような管理方法が適切であるかを知りたいと思います。
VAO の作成については、こちらで詳しく説明しています。