問題タブ [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.
opengl - ホスト メモリとホスト デバイスの同期における OpenGL バッファ管理
多くの変更が必要な 3D モデルとアプリケーションをやり取りさせる方法を考えていました。たとえば、色、テクスチャ ID、位置、さらには法線をアプリケーション自体から自由に変更できるようにしたいと考えています。モデルが変更されるたびに、またはフレームごとにモデル(glBufferData)を再アップロードすることを考えましたが、それは一種のメモリ集約型のようです。
また、クラスがホスト メモリ内のバッファの一部にアクセスできるようにする方法がよくわかりません。例: 属性を持ち、いつでも属性を変更できるクラス「Shape」、バッファーに含まれるものを変更します。このため、どこから始めればよいかわかりません。GPU に送信できないこれらのクラスには、さらに多くの属性が必要であることを指摘する必要があります。私が調べることができるヒント/テクニックはありますか?
編集: Buffer Object Streamingに関するこの記事を見つけ、glBufferData と glBufferSubData を使用して GPU にデータをストリーミングすることについてかなり快適に感じました。ただし、バッファ内のオブジェクトを定義する良い方法を見つけるのにまだ苦労しています。
CPUメモリ内の配列、オフセット、および長さを含む独自のクラス「SubArray」を作成することを検討しました。インデックスを検証し、正しい範囲にない場合は例外をスローするインデクサーがありますが、単純なオブジェクトのブロック サイズを変更 (頂点を追加) できないため、このメソッドを使用するのはあまり快適ではありません。
c++ - 頂点バッファーを使用したダイレクト ステート アクセス
この 2010 年の質問を見ると、最新の OpenGL の頂点バッファーに関して、ダイレクト ステート アクセスが利用できない場合はまだありますか? フレームバッファ、テクスチャなどで DSA を使用するようにグラフィックス ライブラリのほとんどを変更しましたが、頂点配列の状態を設定するために「バインド」する必要があります (配列のバインド、インデックス バッファのバインド、頂点バッファのバインド、配列のバインド解除など)。 )。
更新 1: BDL の回答から、パラメーターが何をするのか理解できませんでした。非常に単純な頂点バッファー (1 つの属性、位置) の単体テストでは、空白の画面が表示されます (頂点ストリームを記述する古い方法で問題なく動作しました)。単一の三角形を描画するだけで、インデックス バッファーは必要ありません。
これが私がやっていることです、コメントは私の理解です:
これで、バインディング ポイントについて「理解」したと思います。それらは、別の属性セットにすばやく簡単に交換できるように、割り当てることができる任意の番号です。したがって、この単純なテストには 0 を使用するだけで十分です。
glCreateBuffers を使用して vbo を作成し、glCreateVertexArrays を使用して vao を作成しています (以前のバインド可能なスタイルから変更されています)。デバッグ出力はなく (デバッグ コンテキストはオン)、すべての呼び出しは glGetError でチェックされ、エラーは報告されません。
更新 2: glVertexArrayVertexBuffer ストライドとオフセットの順序が間違っていました。それは今動作します。
更新 3: glVertexArrayVertexBuffer は、VBO 内の各属性に対して 1 回ではなく、1 回呼び出されます (位置、テクスチャなどをインターリーブしている場合)。
c++ - OpenGL ビッグ プロジェクト、VAO など
だから私はhttps://open.gl/でOpenGL 3.3を学んでいて、いくつかのことについて本当に混乱しました。
- VAO-s。私の理解では、それらは呼び出しを保存するために使用され
glVertexAttribPointer
ます。 - VBO-s。それらは頂点を格納します。複数のオブジェクトで何かを作成している場合、すべてのオブジェクトに VBO が必要ですか?
- シェーダー プログラム - なぜ複数のプログラムが必要なのですか? また、それらは正確には何をしますか?
- この行は正確には何をしますか: glBindFragDataLocation(shaderProgram, 0, "outColor");
最も重要なことは、これらすべてが大きなプログラムにどのように収まるかということです。VAO-sは正確には何のために使用されますか? ほとんどのチュートリアルでは、ハードコーディングされた頂点を持つ 1 つまたは 2 つの立方体を描画することだけをカバーしています。私はこのスレッドを読んで、シーン管理がどのように行われるかについて少し理解しましたが、それでも OpenGL のものをすべてに接続する方法がわかりません。
c++ - 古いスタイルの OpenGL コードを GLSL で動作させる
OpenGL でこのパターンを描画しようとしています:
これを取得するために、次のようなパターンを作成しました。
そして私は次のようにパターンを描いています:
データをglBegin()-glEnd()
ブロックで作成すると、動作が速くなります。しかし、どちらの場合も、GLSL ですべてを行う方がよい方法だと思います。私は、最新の OpenGL の背後にあるロジックをよく理解していませんでした。
頂点バッファ配列とカラー配列を作成しようとしましたが、うまくいきませんでした。問題は、配列をグラフィック カードに転送することではありませんでした。配列でスタック オーバーフローが発生しています。これは別のトピックの問題ですが、これらの巨大な配列をグラフィックス カードに転送することなく、完全に GLSL コード(.vert ファイル内のもの) でこのタスクを実行できるのではないかと思います。
qt - Qt 5.5 と OpenGL: QVertexArrayObject::create() は QPainter::drawimage() を呼び出しますか?
Qt OpenGL の便利なクラスを正しく初期化して使用するには、有効な現在のコンテキストで呼び出す必要があることを理解しています。そのため、オーバーロードQOpenGLWidget::initializeGL()
された関数からクラスを初期化するように設計しました。ドキュメントには、コンテキストが作成され、現在の状態になっていることが記載されています (ただし、フレームバッファーはありません)。
ただし、initializeGL()
サブクラスの 1 つを初期化しようとするとMeshObject
、特に関数を呼び出すとQOpenGLVertexArrayObject::create()
、プログラムがクラッシュしてメッセージが表示されます
Read access violation at 0x0
デバッガーを使用して、コール スタックに注意してください。
QPainter::drawImage への呼び出しが行われていますが、フレームバッファーが存在しないため、確実に失敗します。
しかしQPainter::drawImage
、vertexArrayObject を作成しようとすると呼び出しが発生するのはなぜですか? 確かに、この関数は画面への描画には関与しないはずです。
ドキュメントには、QOpenGLVertexArrayObjects は一部の OpenGL ES 2.0 プラットフォームでのみ動作することも記載されていますvbuffer.create()
が、まったく同じシナリオが発生QOpenGLVertexArrayObjects
し、以前のプロジェクトでこの正確なマシンをまったく問題なく使用しました。
完全なスタック トレース: