私はインスタンス化された図面とインスタンスごとのデータに比較的精通しています。過去にこれを実装して成功しました。
現在、いくつかの古いコードをリファクタリングしており、インスタンスごとのデータがシェーダーに提供される方法にバグを導入しました。関連するビットは次のとおりです。
- glMultiDrawElementsIndirectを使用して実装された作業レンダー ループがあります。インスタンスごとのデータを無視すると、すべてが期待どおりに描画されます。
オブジェクトのワールド変換を格納する vbo があります。AMD のCodeXLを使用してこれをデバッグしました。バッファにはデータが正しく取り込まれ、フレームの描画時にバインドされます。
glBindBuffer(GL_ARRAY_BUFFER,batch.mTransformBuffer); glBufferData(GL_ARRAY_BUFFER, sizeof(glm::mat4) * OBJ_NUM, &xforms, GL_DYNAMIC_DRAW);
シェーダーは入力位置を明示的に指定します。
#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 エラーは生成されません。
私の質問は次のとおりです。インスタンスごとのデータのセットアップがサイレントに失敗する可能性がある状況を知っている人はいますか? または、この問題をさらにデバッグする方法に関する提案はありますか?