0

OpenGL シェーダーの明示的 vs 自動属性位置バインディング」を参照してください。

を使用して属性を明示的にバインドしない場合glVertexAttribPointer、どのデフォルトの場所が使用されますか?

公式リンクはどこにありますか?

4

2 に答える 2

0

いくつかの異なる概念を混同している可能性があると思います。リンクする質問は、頂点シェーダーの属性に場所がどのように割り当てられるかについてです。glBindAttribLocation()またはglGetAttribLocation()その目的で使用されます。

glVertexAttribPointer()一方、属性のデータがどこから来るかを、属性の関連する状態 (タイプ、ストライドなど) と共に指定します。動作する特定の属性は、呼び出しの最初の引数として渡される場所によって指定されます。

属性をまったく呼び出さない場合glVertexAttribPointer()は、いくつかのシナリオが考えられます。

  1. 属性に対して属性配列が有効になっていません。これはglEnableVertexAttribArray()、属性に対して呼び出されたことがない場合、またはglDisableVertexAttribArray()最後に呼び出された場合に発生します。この場合、属性の現在の値が使用されます。これは、 のような呼び出しで設定された値glVertexAttrib4f()であり、デフォルト値は(0.0f, 0.0f, 0.0f, 1.0f)です。

  2. 属性配列が有効な場合、デフォルト値は次の呼び出しに対応します。

    glVertexAttribPointer(location, 4, GL_FLOAT, GL_FALSE, 0, NULL);
    
    1. VBO バウンドがある場合、最後の引数はバッファーへの相対オフセットであるため、これは有効である可能性があります。
    2. VBO がバインドされていない場合、NULL である指定されたポインター アドレスから頂点データを取得しようとするため、ドロー コールはクラッシュする可能性が高くなります。

これらはすべて、 https://www.opengl.org/registry/でアクセスできる公式の OpenGL 仕様ドキュメントに記載されています。

于 2014-11-07T06:48:51.763 に答える