我看到一个问题,即我获取GLSL统一块的错误大小。
这是着色器中的块:
以下是报告内容:
总的来说,我原本预期GLSL块大小应该是36,而不是48。GLSL中的vec3应该像我的glm :: vec3类型一样是一个float。
还请注意,我正在使用HD4000 beta驱动程序:OpenGL 4.0.0 Build 9.17.10.2792。我没有机会在另一台计算机上进行测试。 这是我误解了什么吗?
回复后跟进:
所以,在这种情况下,提交我的glm :: vec3浮点数的正确方法是以下方式吗?
这是着色器中的块:
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类型一样是一个float。
还请注意,我正在使用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));