1

私はインスタンス化された図面とインスタンスごとのデータに比較的精通しています。過去にこれを実装して成功しました。

現在、いくつかの古いコードをリファクタリングしており、インスタンスごとのデータがシェーダーに提供される方法にバグを導入しました。関連するビットは次のとおりです。

  1. glMultiDrawElementsIndirectを使用して実装された作業レンダー ループがあります。インスタンスごとのデータを無視すると、すべてが期待どおりに描画されます。
  2. オブジェクトのワールド変換を格納する vbo があります。AMD のCodeXLを使用してこれをデバッグしました。バッファにはデータが正しく取り込まれ、フレームの描画時にバインドされます。

    glBindBuffer(GL_ARRAY_BUFFER,batch.mTransformBuffer); glBufferData(GL_ARRAY_BUFFER, sizeof(glm::mat4) * OBJ_NUM, &xforms, GL_DYNAMIC_DRAW);

  3. シェーダーは入力位置を明示的に指定します。

    #version 450
    layout(location = 0) in vec3 vertexPos;
    layout(location = 1) in vec4 vertexCol;
    //...
    layout(location = 6)uniform mat4 ViewProj;
    layout(location = 10)uniform mat4 Model;
    

ViewProjマトリックスはすべてのインスタンスで等しく、次を使用して正しく設定されます。

glUniformMatrix4fv(6, 1, GL_FALSE, &viewProjMat[0][0]);

Modelはインスタンスごとのワールド マトリックスです。それは誤りです。すべてゼロが含まれています。

バッファーをバインドした後、各フレームを描画する前に、描画されたすべてのインスタンスが異なる変換を受け取るように、属性ポインターと除数を設定しようとしています。

for (size_t i = 0; i < 4; ++i)
{
  glEnableVertexAttribArray(10 + i);

  glVertexAttribPointer(10 + i, 4, GL_FLOAT, GL_FALSE,
                        sizeof(GLfloat) * 16,
                        (const GLvoid*) (sizeof(GLfloat) * 4 * i));

  glVertexAttribDivisor(10 + i, 1);
}

今、私はしばらくコードを見てきましたが、何が欠けているのか本当にわかりません。CodeXL は、モデル (場所 10) が正しく入力されていないことを明確に示しています。OpenGL エラーは生成されません。

私の質問は次のとおりです。インスタンスごとのデータのセットアップがサイレントに失敗する可能性がある状況を知っている人はいますか? または、この問題をさらにデバッグする方法に関する提案はありますか?

4

1 に答える 1

2
layout(location = 6)uniform mat4 ViewProj;
layout(location = 10)uniform mat4 Model;

これらはユニフォームであり、入力値ではありません。それらは属性によって供給されません。彼らは電話で養われglUniform*ます。入力値にしたい場合は、 ではなくModelで修飾します。inuniform

同様に重要なのは、入力とユニフォームが同じ場所に配置されないことです。つまり、一様な場所は入力場所とは異なる空間を持っているということです。入力はユニフォームと同じロケーション インデックスを持つことができますが、同じものを参照することはありません。入力位置は属性インデックスのみを参照します。均一な場所とは、均一な場所を指します。

最後に、均一な場所は入力場所のようには機能しません。属性を使用すると、各vec4-equivalent は個別の属性インデックスを使用します。均一な場所では、すべての基本型 (構造体でも配列でもないもの) が単一の均一な場所を使用します。したがって、ViewProjが均一な場所であれば、1 つの場所しか占有しません。しかし、Modelが入力の場合、4 つの属性インデックスを使用します。

于 2016-07-04T22:53:00.907 に答える