GLSL ユニフォーム ブロックのサイズが間違っているという問題が発生しています。
これはシェーダーのブロックです。
uniform MaterialInfo {
vec3 Ka;
vec3 Ks;
vec3 Kd;
};
次に、次のコードを使用して、均一なバッファー オブジェクトを準備します。
blockIndex = glGetUniformBlockIndex(program, "MaterialInfo");
if (blockIndex == -1) {
fprintf(stderr, "Could not bind uniform block\n");
}
printf("Found blockindex materialinfo: %d\n", blockIndex);
glGetActiveUniformBlockiv(program, blockIndex, GL_UNIFORM_BLOCK_DATA_SIZE, &blockSize);
blockBuffer = (GLubyte *) malloc(blockSize);
cout << "GLSL blocksize: " << blockSize << endl;
cout << "sizeof glm::vec3 type: " << sizeof(mesh->Ka) << endl;
cout << "sizeof 3 x glm::vec3 type: " << 3 * sizeof(mesh->Ka) << endl;
は次のように報告しています。
GLSL blocksize: 48
sizeof glm::vec3 type: 12
sizeof 3 x glm::vec3 type: 36
要約すると、GLSL のブロックサイズは 48 ではなく 36 であると予想していました。
また、HD4000 ベータ ドライバー (OpenGL 4.0.0 Build 9.17.10.2792) を使用していることにも注意してください。別のコンピューターでテストする機会はありませんでした。これは私が何か誤解しているのでしょうか?
返信後のフォローアップ:
したがって、この場合、glm::vec3 フロートを送信する正しい方法は次のとおりですか?
glGetUniformIndices(program, 3, namesMaterial, indices);
glGetActiveUniformsiv(program, 3, indices, GL_UNIFORM_OFFSET, offset);
memcpy(blockBuffer + offset[0], glm::value_ptr(mesh->Ka), 4 * sizeof(GLfloat));
memcpy(blockBuffer + offset[1], glm::value_ptr(mesh->Ks), 4 * sizeof(GLfloat));
memcpy(blockBuffer + offset[2], glm::value_ptr(mesh->Kd), 4 * sizeof(GLfloat));