問題タブ [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.

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

android - OpenGL-ES VBOグリッドを描画すると、他の三角形が表示されないのはなぜですか?

私はOpenGlにかなり慣れておらず、通常の3Dオブジェクトと混合されたVBOベースのグリッドを表示するのに問題があります。テクスチャ三角形を単独で描画できますが、VBOグリッドを含めると、三角形の表示が停止します。三角形がグリッドに置き換えられる前に、三角形がすばやく点滅します。おそらく、三角形が最初にレンダリングされてから、無効になる前に最初のフレームで機能するためです。

有効にしたすべての状態を無効にして(およびその逆)、プッシュしたすべてのマトリックスをポップしようとしました...

コードを簡略化するために、OpenGl呼び出しを展開しました。

要約すると、描画VBOグリッドコードを削除すると、三角形が表示されますが、含まれるとすぐに三角形が消えます。

どんなアイデアでも、何かを試すためのヒント、私が研究するための方向性、またはそのようなものをいただければ幸いです。私が不必要なことや愚かなことをしているのなら、遠慮なく指摘してください。

乾杯。

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

c++ - OpenGL:深度ソートを備えた頂点配列を使用して効率的なレンダリングシステムを設計するには?

少なくとも Vertex Array を使用するように常に言われます。しかし、私は3D世界にオブジェクトを配置するためにglPushMatrix()withを使用しているので、それは良い考えではないと思います.glTranslatef/glRotatef

では、世界の回転/移動された頂点位置の使用をやめてglPushMatrix()「手動で」計算し、頂点データを頂点配列にプッシュして一度にレンダリングする必要がありますか?

しかし、深度ソートされている画面上のすべてのオブジェクトに異なるテクスチャ サーフェスを使用すると、これらすべてがさらに混乱します。

そう:

  1. 各オブジェクトにテクスチャ サーフェス ID も格納する必要があります。
  2. 表示されているすべてのオブジェクトを Z 位置で並べ替えます (ゲームはトップダウンでのみ表示され、すべてのオブジェクトはフラットです)。
  3. この並べ替えられた配列を調べます。
  4. 新しいバッファーを作成し、頂点/texcoord/color/normal のみをこのバッファーにコピーします。
  5. テクスチャ サーフェス ID が以前の ID から変更されるたびに、正しいテクスチャ ID にバインドします。
  6. 収集した頂点データをアップロードします。
  7. 一時的な頂点配列に使用されているバッファーを解放します。
  8. 最初に並べ替えたすべてのデータを処理するまで、手順 4 ~ 7 を繰り返します。
  9. 並べ替えた配列データを解放し、手順 1 ~ 9 を繰り返します。

私はそれを正しくやっていますか?

また、ソートするオブジェクトのデータ構造をどのように設計すればよいですか? 例えば、std::vector各オブジェクトの頂点データを保存するために使用するのは良いですか? または、より良い代替手段はありますか?std::vectorこのすべてのデータを保存するには、次のようになると考えていました。

std::vectorまた、ステップ 4:この場合、既存のものを使用することは可能ですか? 頂点配列を GPU に送信する場合のように、未加工の配列を使用する必要があるという考えがありました。または、テクスチャ ID が変更されるたびに新しいバッファーを作成せずに、何らかの方法で (効率的に) ここでnew float[100]並べ替えられた既存の配列を使用できますか?std::vector

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

opengl - OpenGLVBOが表示されない

VBOでの描画に問題があります。イミディエイトモードを使用すると、ポイントの立方グリッドを簡単に描画できますが、非常に低速です。VBOを使用して、描画を高速化してみたかったのです。SDL/glewを使用しています。私の出力は単一の黒い点です。同じsdl/glewセットアップコードがテクスチャ三角形で機能しましたが、データを格納するために構造体を使用しませんでした-キャッシュ目的の構造体が必要なので、頂点の色は頂点の位置に近くなります。

sdl / glewを設定するには:

VBOを作成します。

描く:

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

android - Android で OpenGL ES を使用して透明なテクスチャを表示する際の問題

Android で OpenGL を使用して透明なテクスチャをレンダリングする方法の解決策を探すために、1 日以上投資しました。明らかに、他の人は私よりも運が良かったのですが、提供されたさまざまなソリューション (たとえば、Android 用の OpenGL ES の透明なテクスチャ) を試した後も、まだ解決できません。

これが私の基本的なセットアップです:

テクスチャは ... 経由でロードされます。

...そして、これが事前に乗算されたアルファによる問題につながるというヒントがあります。しかし、ReplicaIsland は GLUtils 関数も使用しており、ゲームは透明な画像に問題があるようには見えません。

アルファ チャネル (PNG) でテクスチャを描画すると、真っ黒に表示されます。アルファのないテクスチャは、それぞれの色で正しく描画されます)。さまざまな glBlendFunc 呼び出しを適用しましたが、うまくいきませんでした。

私もこれを試してみました

その結果、テクスチャは常にまったく見えなくなります (完全に透明ですか?)。

テスト用の画像は ReplicaIsland プロジェクトから使用されています。これらは標準の PNG です。これは、使用されるテクスチャが 2 の累乗規則に準拠していることも意味します。これは、さまざまな投稿で提供されている別のソリューションです。違いが 1 つあります。ReplicaIsland はほとんどが draw_texture 拡張機能に依存しているように見えますが、VBO を使用する必要があります (回転を適用できるようにするため)。

助けていただければ幸いです。ありがとうベン

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

opengl-es - OpenGL ES: glBufferSubData がメッシュを VBO/IBO に塗りつぶし、glDrawElements がすべてのメッシュではなく最初のメッシュのみをレンダリングする

私の問題は本当に単純なようですが、その背後にある理由がわかりません:

  • glBufferSubData で埋められる頂点とインデックス バッファがあります。この大きな VBO とそれに対応する IBO に 1 つずつ埋められるメッシュがいくつかあります。
  • 次に、glDrawElements を使用してこれらの小さなメッシュを 1 つずつレンダリングしようとします。

問題は、最初のメッシュだけがレンダリングされ、複数回レンダリングされることです。

次の情報が役立つ場合があります。

この方法でVBOを作成します

次に、各メッシュは次のように VBO に埋められます

そして、メッシュはこのようにレンダリングされます

  • VBO/IBO をバインドし、適切なクライアント状態を設定する
  • 次に、頂点、法線、および texcoord の「ポインター」を設定します。これらは、VBO の先頭と、頂点の「構造」内のオフセットを指します。
  • そして電話するgl.glDrawElements(GL10.GL_TRIANGLES, indicesNum, GL10.GL_UNSIGNED_SHORT, startIndexOffsetInBytes);
  • 最後に、VBO/IBO のバインドを解除し、クライアントの状態を無効にします

sizeInBytesコードをデバッグしたところ、 、startOffsetInBytesnumBytesToCopyおよびstartIndexOffsetInBytesが正しい値 (バイト単位:))) でindicesNumあり、(レンダリングする) メッシュ内のインデックス/頂点の数であると確信しています。

疑わしい場所の 1 つは、頂点/法線/texcoord ポインターの設定です。これらは一度だけ設定され、VBO の先頭に設定されます。glDrawElements を呼び出す前に毎回設定する必要があるのではないでしょうか?

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

opengl - VBO のインターリーブはプロフォーマンスに役立ちますか、それとも妨げますか?

OpenGL VBO を使用すると、データをインターリーブできます

たとえば、頂点データを GPU ではなく CPU で使用する他のデータとインターリーブすることもできます。

インターリーブは、メインストリームのディスクリートおよび統合グラフィックスのパフォーマンスを向上させますか?それとも妨げますか?

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

opengl - jogl で頂点バッファーを使用すると、三角形が多すぎるとクラッシュする

3D ジオメトリを描画する Jogl を使用して Java で簡単なアプリケーションを作成しました。マウスをドラッグすると、カメラを回転させることができます。アプリケーションは正常に動作しますが、glBegin(GL_TRIANGLE) ... 呼び出しでジオメトリを描画するのは遅すぎます。

そこで、頂点バッファーを使い始めました。これも、三角形の数が 1000000 を超えるまでは正常に機能します。その場合、ディスプレイ ドライバーが突然クラッシュし、モニターが暗くなります。バッファーに収まる三角形の数に制限はありますか? 妥当なフレーム レートで 1000000 個の三角形をレンダリングしたいと考えていました。

この問題をデバッグする方法がわかりません。厄介なのは、ディスプレイを再び機能させる方法が他にないため、起動するたびに Windows を再起動する必要があることです。誰かアドバイスをくれませんか?

頂点、三角形、および法線は、配列 float[][] m_vertices、int[][] m_triangles、float[][] m_triangleNormals に格納されます。バッファを次のように初期化しました。

次に、シーンは次のようにレンダリングされます。

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

opengl - GPU カーネルからの位置と向きでオブジェクトを空間に複製する

環境

私は、科学的な目的で GPU プログラミング (OpenCL と CUDA の両方ですが、もちろん同時にではありません) を使用して群れのシミュレーションを行っています。表示にはOpenGLを使用しています。

ゴール

同じオブジェクトを描画したいと思います — つまり群がる粒子で、2D では単純な三角形にすることができます — 次のことを知っている最も効率的な方法で、異なる位置と異なる向きで N 回描画します。

  • オブジェクトは常にまったく同じです

  • 位置と向きは GPU で計算され、GPU メモリに保存されます。

  • 粒子数 N は大きくなる可能性があります

現在のソリューション

これまでのところ、データが CPU に送り返されないようにするために、位置と方向の配列を VBO に保存し、次を使用します。

配列を CPU にコピーし直すことなく、色分けされた速度で一連の点を描画します。

私がやりたいことは、VBO を CPU にコピーし直さずに、単純な点ではなく完全なオブジェクトを同様の方法で描画するようなものです。

基本的に、オブジェクトのモデル(Display List? a Vertex Array?) を GPU に保存し、GPU の位置と向きを使用して、データを CPU に送り返すことなくオブジェクトを N 回描画したいと考えています。

それは可能ですか?それ以外の場合、どのようにすればよいですか?

PS: 私はコードをきれいに保つのが好きなので、表示の問題を群がるカーネルから切り離したいと思います。

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

opengl - openglvboアドバイス

私はBlenderで設計されたモデルを持っており、それをcolladaにエクスポートした後、openglを使用して構築されたゲームエンジンでレンダリングします。ブレンダーのモデルはグループに分けられます。これらのグループには、独自のインデックスを持つ頂点法線とテクスチャが含まれています。各グループを個別のvboとしてレンダリングするのは良いことですか、それともモデル全体を単一のvboとしてレンダリングする必要がありますか?

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

c++ - OpenGL VBO 更新データ

数千の頂点を保持するバッファーを描画する必要があります。vbo を使用してデータを保存しています。

VBO を何度も更新する必要があることはわかっていますが、一度に小さな部分だけを更新する必要があります。

だから私はそうするための最良の方法は何だろうと思っています:

  1. VBO を小さな VBO (300 頂点のように保持する) に分割し、個々の VBO を 1 回の呼び出しで更新しますか?
  2. 1 つの大きな VBO と多くglBufferSubData()呼び出しを使用しますか?
  3. glMapBuffer()1 つの大きな VBOを使用しますか?