2

マトリックス ユニフォームを 1 つのブロックに切り替えましたが、マトリックスの生成方法を変更していなくても、シェーダーへの取り込み方法のみを変更しただけで機能しなくなりました。

私のユニフォームブロックは次のように定義されています:

layout(row_major, std140) uniform MatrixBlock {
    mat4 model;
    mat4 view;
    mat4 proj;
};

均一ブロックを次のように設定しました。

void UniformBlock::generateBuffer() {
    glGenBuffers(1, &buffer);
    glBindBuffer(GL_UNIFORM_BUFFER, buffer);
    glBufferData(GL_UNIFORM_BUFFER, size(), NULL, GL_STREAM_DRAW);
    glBindBufferRange(GL_UNIFORM_BUFFER, bindingIndex, buffer, 0, size());
    glBindBuffer(GL_UNIFORM_BUFFER, 0);
}

size()192この場合は単に戻ります。

次に、次のようにプログラムをバインド インデックスにバインドします。

void UniformBlock::bind(GLuint program) const {
    GLuint index = glGetUniformBlockIndex(program, getBlockName().c_str());

    if(index != GL_INVALID_INDEX) {
        glUniformBlockBinding(program, index, getBindingIndex());
    }
}

getBlockName()"MatrixBlock"この場合は戻ります。

次に、次を使用して行列を設定します。

void MatrixBlock::bindMatrix(size_t offset, const Matrix4& matrix) {
    MatrixBlock& self = instance();

    glBindBuffer(GL_UNIFORM_BUFFER, self.getBuffer());
    glBufferSubData(GL_UNIFORM_BUFFER,
                    offset * Matrix4::size(),
                    Matrix4::size(),
                    matrix.asArray()); //Matrix4 holds the actual matrix data in a std::array<float, 16>, this method gets the std::array.begin()
    glBindBuffer(GL_UNIFORM_BUFFER, 0);
}

offset次のいずれかです。

enum Variables {
    MODEL = 0,
    VIEW = 1,
    PROJECTION = 2,
};

MatrixBlockの単なるサブクラスですUniformBlock(シングルトンであるため、最初の行です)

Matrix4::size()戻り値sizeof(float) * 16

ユニフォームの変数のサイズを次のようにクエリすると、次のようになります。

GLuint blockIndex;
GLuint indices[3];
GLint offsets[3];
GLsizei sizes[3];

glBindBuffer(GL_UNIFORM_BUFFER, MatrixBlock::instance().getBuffer());
blockIndex = glGetUniformBlockIndex(getProgram(), "MatrixBlock");
glGetActiveUniformBlockiv(getProgram(), blockIndex, GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES, (GLint*)indices);
glGetActiveUniformsiv(getProgram(), 3, indices, GL_UNIFORM_OFFSET, offsets);
glGetActiveUniformsiv(getProgram(), 3, indices, GL_UNIFORM_SIZE, sizes);
glBindBuffer(GL_UNIFORM_BUFFER, 0);

私はこれを得る

Name               Index Offset Size
MatrixBlock.model  0     0      1
MatrixBlock.view   1     64     1
MatrixBlock.proj   2     128    1

サイズが 1 つとして報告されるのはなぜですか? 64じゃないの?これが私の問題の原因ですか?


github でソース全体を表示できます: lerp@github

4

0 に答える 0