- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我发现一个问题,我得到的 GLSL 统一 block 大小错误。
这是着色器中的 block :
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 block 大小为 36,而不是 48。GLSL 中的 vec3 应该像我的 glm::vec3 类型一样是 float 。
另请注意,我使用的是 HD4000 测试版驱动程序:OpenGL 4.0.0 Build 9.17.10.2792。我还没有机会在另一台计算机上进行测试。我是不是误会了什么?
回复后跟进:
那么在这种情况下,提交我的 glm::vec3 float 的正确方法如下?
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));
最佳答案
In summary, I was expecting the GLSL blocksize to be 36, not 48. vec3 in GLSL should be a float like my glm::vec3 types.
为什么? OpenGL 规范中没有任何内容可以保证 block 大小。
或者至少,不是那个统一 block 的定义。
不提供 proper memory layout qualifier , shared
默认使用。这允许实现在元素之间放置它感觉舒服的任何填充。所以你不能假设 3 个 vec3
将占用 12 个连续的 float
大小。每个 vec3
将是 3 个连续的 float
,但不能保证不会有填充。
如果您想要统一 block 的固定、已知且一致布局,则需要使用std140
布局。否则,您将获得实现所提供的内容。 OpenGL 规范详细说明了 std140
元素布局的规则。
当然,对于 std140
布局,此 block 的大小也为 48,因为它将所有 vec3
元素填充到 vec4
s.
So in this case the correct way to submit my glm::vec3 floats is the following?
这是正确的,假设:
memoryBlock
是映射缓冲区对象指针或您使用 glBufferSubData
GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT
对齐)。mesh->Ka
及其同类实际上执行 4 个 float 。否则,您将从未分配的内存中复制。再次,我敦促您停止查询这些东西并使用std140
布局。当你这样做时,你将不必查询偏移量或任何东西;您可以设计与所有硬件上的 GLSL 定义完全布局兼容的结构。
关于opengl - 统一缓冲区,glGetActiveUniformBlockiv 大小报告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12735221/
我发现一个问题,我得到的 GLSL 统一 block 大小错误。 这是着色器中的 block : uniform MaterialInfo { vec3 Ka; vec3 Ks;
我是一名优秀的程序员,十分优秀!