gpt4 book ai didi

opengl - 统一缓冲区,glGetActiveUniformBlockiv 大小报告

转载 作者:行者123 更新时间:2023-12-01 10:59:17 25 4
gpt4 key购买 nike

我发现一个问题,我得到的 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 元素填充到 vec4s.


So in this case the correct way to submit my glm::vec3 floats is the following?

这是正确的,假设:

  1. memoryBlock 是映射缓冲区对象指针或您使用 glBufferSubData
  2. 上传的东西
  3. 您正在将其上传到缓冲区的前面或适当的偏移量之一(glBindBufferRange 的统一 block 偏移量必须与 GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT 对齐)。
  4. mesh->Ka 及其同类实际上执行 4 个 float 。否则,您将从未分配的内存中复制。

再次,我敦促您停止查询这些东西并使用std140 布局。当你这样做时,你将不必查询偏移量或任何东西;您可以设计与所有硬件上的 GLSL 定义完全布局兼容的结构。

关于opengl - 统一缓冲区,glGetActiveUniformBlockiv 大小报告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12735221/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com