問題タブ [vertex-array]

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.

0 投票する
2 に答える
821 参照

opengl - GL_VERTEX_ARRAY に関する質問

これは単なる関心事ですが、GL_VERTEX_ARRAY が「保持」し、drawArrays() などを介してレンダリングする頂点の量に制限はありますか? それとも、理論的には数百万の頂点を通過しても drawArrays() を呼び出すことができるでしょうか?

0 投票する
1 に答える
3266 参照

optimization - レンダリングの最適化

描画呼び出しが少ない=高速であると聞いています。暗黙のレッスンは、描画呼び出しの数を最小限に抑えるために、できるだけ多くの頂点データをできるだけ少ない配列にパックすることです。

OpenGLの上にレンダリングフレームワークを作成して、すべての頂点データを少数の配列にパックし、数回の描画呼び出しでシーン全体を描画することを考えていました。

私の質問は、1回の呼び出しで(たとえばglDrawElementsに対して)大量の描画を行うと、これが実際に速くなるかどうかです。

また、1回の呼び出しで大きすぎる頂点配列を描画しようとすると、キャッシュがオーバーフローし、実際には高速にならないということも聞いています。

0 投票する
1 に答える
1887 参照

c++ - OpenGL を使用して C++ で多数のデータ ポイントを含む散布図を描画する最良の方法

UDP ソケットを介して 4 次元のポイント データを取得し、そのデータを 6 つの個別の 2D 散布図にプロットするプログラムを C++ で作成しています。たとえば、次元に A、B、C、D という名前を付けると、6 つの 2D プロットは AxB、AxC、AxD、BxC、BxD、および CxD になります。数時間で、プログラムは最大 5 万ポイントを獲得します。

現在、イミディエイト モードを使用して、各ポイントを 1 回プロットしています。描画呼び出しの間にバッファをクリアしないので、以前にプロットされたポイントはバッファがクリアされるまで保持されます。即時モードは遅く、非推奨であるため、この方法には満足していません。ウィンドウのサイズが変更されたときなど、バッファをクリアする必要がある場合、以前にプロットしたデータはすべて失われます。バッファがクリアされた後もデータを永続化できるソリューションを考えたいと思います。さらに、ウィンドウのサイズ変更でもプロットを簡単にスケーリングできると便利です。

座標系ごとに頂点配列 (2 次元) を維持することを考えましたが、それには 6 つの個別の配列が必要であり、4 次元すべての配列を維持するのに 3 倍のメモリが必要です。

私はこれについて正しい方法で考えていますか?この問題の適切な解決策は何ですか?

最終的な目標は、できるだけリアルタイムに近いデータを表示するアプリケーションを作成することです。

編集ポイントが入ってくると1つずつプロットし続け、画面のサイズを変更する必要があるときに画面の画像を取得して、その画像のサイズを変更したバージョンを表示することは可能でしょうか?

0 投票する
2 に答える
1596 参照

c++ - 頂点配列の各ポリゴンのテクスチャリング-OpenGL

レンダリング機能を動作させようとしています。頂点配列を使用しています。これが私の頂点構造です。

これが私のレンダリングコードです:

引数の1つである、GLuint *テクスチャには、ロードされたすべてのテクスチャが含まれています。したがって、line int tex = region [i] .meshptr-> poly[j].tex;によって返される値。この特定のポリゴンのテクスチャのインデックスです。レンダリングするときに、それを各ポリゴンにバインドするにはどうすればよいですか?ご不明な点がございましたら、お気軽にお問い合わせください。

glClientActiveTexture()を使用する必要があることはわかっていますが、1つは未定義であり、正しいヘッダーが見つからないことを示しています。2つは、どのように使用されているかわかりません。良い例は見つかりませんでした。では、ポリゴンがテクスチャインデックス4を参照しているとしたら、glClientActiveTextureでレンダリングするときに、ポリゴンにバインドするにはどうすればよいですか。

0 投票する
1 に答える
3308 参照

opengl - OpenGL インスタンス配列の描画

シンプルな OpenGL プログラムがあり、頂点シェーダーに格納されたインスタンス化された配列を描画しようとしています。レンダリングに次の 2 つのシェーダーを使用しています。

頂点シェーダー:

フラグメント シェーダー:

これらのシェーダーをコンパイルして検証した後、頂点配列オブジェクトを作成し、三角形のストリップのように描画します。

描画のビューポートは、glViewport(0, 0, 800, 600) のようにウィンドウサイズに設定されます。次のコードを使用して、単純な正射行列を MVP に渡します。

行列が初期化された場所:

問題は、画面に三角形のストリップがないことです。MVP マトリックス (gl_Position = vec4(Position[gl_VertexID], 0.0, 1.0)) なしで頂点を描画しようとしましたが、何も得られませんでした。問題がどこにあるかを検出する方法は?

0 投票する
1 に答える
1416 参照

c++ - C ++構造体メモリレイアウトとOpenGLglVertexPointer?

頂点データを保存するための次の構造体があります。

頂点のリストを次のようにSTLベクトルに格納します。

これをOPEGLの頂点配列として使用しようとすると、inが正しくレンダリングされません。

そこで、次のようにポインタ演算を使用して値を確認しようとしました(OPENGLがデータを処理する方法を想定しています)。

構造体から値に直接アクセスする場合、値は等しくありません。

これは、構造体が値を連続して保存しないことを意味しますか?

[編集]12の代わりにsizeof()を使用すると、次のように問題が修正されることに気づきました。

しかし、それでも、ハックがメモリ内を正しくトラバースしなかった理由がわかりません(qDebugが同じ値を出力しないのはなぜですか?)

0 投票する
1 に答える
733 参照

c++ - glVertexPointerストライド変数を使用して配列をプロットした奇妙な結果

とを使用してプロットしたい頂点のNx4配列がglVertexArrayありglDrawArrayます。2D散布図として。私は現在、次のように配列を初期化します。

次に、2D散布図を次のように描画します。

これは次のように正しく表示されます:

ここに画像の説明を入力してください

注:背景の色付きの正方形は、ポイントが正しい位置にあるかどうかを簡単に判断できるようになっています

ただし、2次元プロットのみが必要なので、2つの未使用の次元をスキップしたいと思います。頂点のポイントが2つしかないことを伝えglVertexPointerてから、頂点間のストライドも2に設定してみましたが、思ったとおりに機能していないようです。

ただし、これをプロットすると、非常に異なる結果が得られ、ポイントがXxY、YxZ、ZxWに表示されます。

ここに画像の説明を入力してください

ストライド変数の適切な機能を誤解しましたか?そうでない場合、下のプロットが上のプロットに似るようにストライドを適切に設定するにはどうすればよいですか?

0 投票する
1 に答える
1543 参照

opengl - OpenGLスケーリング頂点配列

次のように描画する頂点配列があります(これを単一のglDrawArrays呼び出しに変換するように取り組んでいるため、ここでは問題になりません)。

これは機能しますが、描画されているラインループをスケーリングしたいと思います。glDrawArraysを呼び出すglScaled前に呼び出してみましたが、ポイントが表示されません。スケーリングはラインループを所定の位置にスケーリングするだけだと思いましたが、そうではないようです。

同じバッファを異なるスケールで再利用できることを望んでいたため、バッファ内の頂点がスケールされていないことに注意してください。アイデアは、パスごとに配列を再作成せずに、一定のピクセルサイズで形状を再描画できるということです。

誰かが私が間違っていることを説明できますか、またはこれが可能かどうかさえわかりますか?

0 投票する
5 に答える
20751 参照

opengl - VAO と要素配列バッファーの状態

私は最近、Vertex Array Objects (VAO) を使用して OpenGL 3.3 コードをいくつか書いていて、後で Intel グラフィックス アダプターでテストしましたが、残念なことに、要素配列バッファー バインディングは明らかに VAO 状態の一部ではないことがわかりました。

効果はありませんでしたが、

ジオメトリをレンダリングしました。私はそれが OpenGL の Intel 実装の単なるバグだと思っていました (GL_ARB_vertex_array_object (および GL_OES_vertex_array_object でさえも) 要素配列保存された状態の一部であることが明確に述べられているため) が、モバイル NVIDIA Quadro 4200 で発生しました。 .

ドライバーのバグですか、仕様のバグですか、それともコードのどこかにバグがありますか? コードは GeForce 260 および 480 で問題なく動作します。

似たような経験をした人はいますか?

また、GL_EXT_direct_state_access には、要素配列バッファーを VAO にバインドする関数がないことも奇妙です (ただし、頂点属性配列、つまり配列バッファーを指定する関数はあります)。GPU メーカーは仕様を台無しにして、私たちをごまかしていますか、それとも何ですか?

編集

ここでは必要ないと思ったので、最初はソース コードを表示するつもりはありませんでした。ただし、要求に応じて、問題を再現する最小限のテスト ケースを次に示します。

上記のコードは、赤、青、黒の 3 つのクワッドを含む頂点バッファーを作成します。次に、個々のクワッドを指す 3 つのインデックス バッファーを作成します。次に、2 つの VAO が作成され、設定されます。1 つには赤いクワッド インデックスが含まれ、もう 1 つには青いクワッド インデックスが含まれます。黒のクワッドはまったくレンダリングしないでください (BIND_BLACK_QUAD_ELEMENT_ARRAY_BUFFER定義されていると仮定します)。

これにより、ビューポートがクリアされて灰色になり、青または赤の四角形が繰り返しレンダリングされます (どちらも印刷されます)。これはデスクトップ GPU では機能しますが、ノートブック GPU では機能しません (VAO_DOESNT_STORE_ELEMENT_ARRAY_BUFFER マクロが定義されていない限り、黒いクワッドがレンダリングされます。BIND_BLACK_QUAD_ELEMENT_ARRAY_BUFFER マクロを未定義にすると、青色のインデックス バッファーが最後にバインドされるため、クワッドが青色になります。しかし、そうではありません。何があっても赤いクワッドをレンダリングします。

私の見方では、これは、VAO がどのように機能するかについての私の理解における致命的な誤解、コードのバグ、またはドライバーのバグのいずれかです。

完全なソース
バイナリ (Windows、32 ビット)

0 投票する
2 に答える
2664 参照

java - 複数の glDrawArrays() を使用するか、すべての頂点を 1 つの大きな glDrawArrays-call に集める必要がありますか?

私は個人的な Java OpenGL (JOGL) プロジェクトに取り組んでおり、個別の描画関数と頂点を持ついくつかのカスタム オブジェクトを使用しています。

次に、これらの立方体の束全体をループして、描画関数を呼び出します。私の質問は次のとおりです。すべての頂点を 1 つの大きな glDrawArrays 呼び出しに集める必要がありますか。つまり、すべての頂点を 1 つの大きな配列に集めて描画する必要がありますか? パフォーマンスと fps に大きな影響を与えますか?