我看到一個問題,我得到的GLSL統一塊的大小錯誤。統一緩衝區,glGetActiveUniformBlockiv報告的大小
這是着色器中的塊:
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的塊大小爲36,而不是48。GLSL中的vec3應該像我的glm :: vec3類型。
另請注意,我使用的是HD4000 beta驅動程序: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));
對齊?我敢打賭,這些vec3s正在被vec4s填補。 – genpfault
他們爲什麼被填充? – toeplitz