問題タブ [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.
c++ - glGenVertexArrays メイン ループでは一意の VAO を作成しないが、それ以外の場合は機能する
私は現在、自分が書いているゲーム エンジン用の小さなエディターに取り組んでいます。新しいモデルを作成してレンダリング エンジン マネージャーに追加するモデルを追加するオプションがある Qt 5.6 でファイル メニューを設定しました。Mac OSX 10.11 (OpenGL 3 または 4) では問題なく動作します。Ubuntu 16.04 では、わずかにしか機能しません。メイン ループの外で、必要な数のモデルを初期化できます。ただし、メイン ループ内では、メイン ループ外で初期化した数のモデルしか初期化できません。IDE 内で gdb をプルアップすると、問題は VAO に関連しているようです。OSX では、メッシュを作成する場所に関係なく、モデルごとに新しい VAO が初期化されます。Ubuntu では、メイン ループの外側で、メッシュごとに新しい VAO が生成されます。メイン ループの内側で描画されるメッシュはすべて、メイン ループの外側で以前に作成されたメッシュと同じ VAO を持ちます。
要約すると、Ubuntu では、メイン ループの外側にあるすべてのモデルが独自の VAO を取得します。メイン ループ内で、VAO Gluint ハンドルが再び 2 から再カウントを開始します。ハンドル/タグのカウントが過ぎても、メイン ループの外で多くのモデルが初期化されると、モデルは描画を停止します。1 つの Mac OSX で問題なく動作します。これは OpenGL/Qt の問題であると思われるため、エンジン用の余分なコードがたくさんありますが、質問するのは当然だと思います。リンク: https://github.com/BennetLeff/engine
かなりの数のファイルがあるので、必要と思われるものだけを含めますが、github プロジェクトにもリンクします。大きなコード ダンプで申し訳ありませんが、他に提供できるものがあれば教えてください。
メッシュ.cpp
メイン.cpp
GUIWindow.cpp (QOpenGLWidget、QOpenGLFunctions から継承)
Model.cpp (AssImp からデータを取得するモデルの読み込みを除く)
RenderingEngine.cpp
Editor.cpp (ウィンドウを設定したほとんどの Qt 呼び出しを除く)
opengl - 1 つの Vertex Array オブジェクトに複数のストレージ レイアウトを含める方法は?
ストレージ レイアウトとは、 で定義するものを意味しますglVertexAttribPointer
。この状態は、現在バインドされている VAO またはバインド先のバッファーに保存されGL_ARRAY_BUFFER
ますか?
opengl - インスタンス化された配列を使用するときに glVertexAttribPointer 呼び出しを最小限に抑える方法は?
すべてのモデル データに対して 1 つの VAO と 2 つの VBO を使用する OpenGL コードがあります。1 つ目は位置や法線などの標準の頂点属性用で、2 つ目はモデル マトリックス用です。インスタンス化された描画を使用しているため、モデル マトリックスをインスタンス化された配列 (基本的には頂点属性) としてロードします。
まず、標準の頂点属性を VBO にロードし、glVertexAttribPointer
. 次に、モデル マトリックスを別の VBO に読み込みます。glVertexAttribPointer
ここで、描画ループを呼び出す必要があります。どうにかしてこれを防ぐことはできますか?
コードは次のようになります。
頂点データと行列を 1 つの VBO に格納するアプローチを考えました。問題は、ストライドを正しく設定する方法です。解決策を思いつきませんでした。
どんな助けでも大歓迎です。
c++ - 複数の GL_ARRAY_BUFFER バッファを持つことはできますか?
そのため、コマンド glVertexAttribPointer に関する別の SO の質問を見ていましたが、少し混乱しました。この質問に対する受け入れられた回答は、次のように説明しています。
しかし、呼び出しを行ったときに属性 0 に保存される追加の暗黙の状態があります。データは、現在 GL_ARRAY_BUFFER にバインドされているバッファーから読み取られます。
これは私には理にかなっていますが、バインドされている複数のバッファーがある場合はどうなりGL_ARRAY_BUFFER
ますか? メソッドは、どのglVertexAttribPointer()
属性を設定するかをどのように認識しますか?
たとえば、私のコードでは、グラデーションの三角形を描いています。これを行うために、2 つの VBO を作成しました。1 つは配列内のカラー データで、もう 1 つは頂点の位置です。
コマンドを呼び出すとき、使用するバッファをどこで指定しますか?
c++ - 頂点シェーダーに渡された値を読み取れない
OpenGL のさまざまなタイプの GLSL シェーダーに頭を悩ませようとしています。現時点では、2D レイヤード タイルの実装に苦労しています。何らかの理由で、シェーダーに渡される int 値は常に 0 (または null の可能性が高い) です。
現在、20x20 のタイルで構成される 2048x2048px の 2D テクスチャがあります。1 つのクワッドをテクスチャリングし、頂点シェーダーに渡す int のブロックに基づいてタイルのインデックスを変更しようとしています。
クワッドの位置にフロートの vec2 を渡しています (実際には TRIANGLE_STRIP)。また、タイルの 6 層を表す 6 つの int を渡そうとしています。
私の入力:
私のセットアップ:
私の引き分け:
vertexShader 内から値をハードコーディングすることで出力を調整できるため、私のシェーダーは確実に機能します。私の疑いは、値を正しく/正しい形式で渡していないか、頂点ごとに int[6] を含める必要があることをどこかに示していないことです。
int Base[6]; のレイアウト (場所 = 1) から何も読み取れません。考えられることはほぼすべて試しました。各intを個別に宣言し、2つのivec3、uint、および他に考えられるものを読み取ろうとしましたが、すべてが0で返されます。
完全を期すために、以下は私の頂点とフラグメント シェーダーです。
断片:
c++ - glGenVertexArrays および glGenBuffers 引数
OpenGL 3.0+ に関するチュートリアルでは、頂点配列オブジェクトと頂点バッファー オブジェクトを次のように作成します。
ここで、VAO はunsigned int
( GLuint
) であり、そのアドレスを関数 でそれに渡しますglGenVertexArray
。ただし、ドキュメントによると、関数の 2 番目の引数は( ) の配列に する必要があります。VBO と. 上記のコードがそのような引数で機能する理由がわかりません。unsigned int
GLuint*
glGenBuffers
上記のコードをこれに置き換えようとしました(そして、コードの他の場所で必要な変更を行います):
コンパイルして実行しますが、予期しない動作が発生します。テクスチャ付きの四角形は最初の構文でレンダリングされますが、2 番目の構文ではレンダリングされません。なぜこれが起こるのか理解できません。
編集:ありがとう。前述のとおり、2 番目のコードにはインデックス付けの誤りがあります。