gpt4 book ai didi

c++ - OpenGL 中的统一 block

转载 作者:行者123 更新时间:2023-11-28 06:07:50 26 4
gpt4 key购买 nike

我按照 David Wolff 的书 GLSL 将数据发送到 OpenGL 中的统一 block 。

layout(std140) uniform BlobSettings {
vec4 InnerColor;
vec4 OuterColor;
float RadiusInner;
float RadiusOuter;
};

客户端代码:

GLuint blockIndex = glGetUniformBlockIndex(programHandle, "BlobSettings");

// Allocate space for the buffer
GLint blockSize;
glGetActiveUniformBlockiv(programHandle, blockIndex,
GL_UNIFORM_BLOCK_DATA_SIZE, &blockSize);
GLubyte* blockBuffer = (GLubyte *) malloc(blockSize);

// Query for the offsets of each block variable
const GLchar *names[] = { "BlobSettings.InnerColor", "BlobSettings.OuterColor",
"BlobSettings.RadiusInner", "BlobSettings.RadiusOuter" };

GLuint indices[4];
glGetUniformIndices(programHandle, 4, names, indices);

GLint offset[4];
glGetActiveUniformsiv(programHandle, 4, indices, GL_UNIFORM_OFFSET, offset);

// Store data within the buffer at the appropriate offsets
GLfloat outerColor[] = {0.0f, 0.0f, 0.0f, 0.0f};
GLfloat innerColor[] = {1.0f, 1.0f, 0.75f, 1.0f};
GLfloat innerRadius = 0.25f, outerRadius = 0.45f;

memcpy(blockBuffer + offset[0], innerColor, 4 * sizeof(GLfloat));
memcpy(blockBuffer + offset[1], outerColor, 4 * sizeof(GLfloat));
memcpy(blockBuffer + offset[2], &innerRadius, sizeof(GLfloat));
memcpy(blockBuffer + offset[3], &outerRadius, sizeof(GLfloat));

程序在执行memcpy 时出现段错误。当我在那里设置断点时,我发现 glGetActiveUniformsiv 返回偏移量和索引错误。例如:

offset[]
0: 530332809
1: 2686632
2: 1971058176
3:0

虽然我希望它们是 0、4、8、12 等或接近于此的值。如何修复此错误?

最佳答案

我想知道你为什么在首先使用 std140 时使用这种偏移机制?

我认为您的书没有提到 std140 具有非常具体的对齐规则,这意味着您无需查询即可计算出所有这些成员的偏移量。这是一个重要的概念,如果跳过它对您根本没有帮助。

遵循 std140 规则,您已经拥有正确对齐的数据结构。

layout(std140) uniform BlobSettings {
vec4 InnerColor; // 4N begins at 0
vec4 OuterColor; // 4N begins at 4 (divisible by 4 -- YES)
float RadiusInner; // 1N begins at 8 (divisible by 1 -- YES)
float RadiusOuter; // 1N begins at 9 (divisible by 1 -- YES)
};

这个数据结构的偏移量将是

0  (InnerColor),
16 (OuterColor), // 4x sizeof GLfloat (vec4)
32 (RadiusInner), // 8x sizeof GLfloat (vec4, vec4)
36 (RadiusOuter) // 8x sizeof GLfloat + sizeof GLfloat (vec4, vec4, float)

这里有一点您需要牢记,如果您要按照 std140 规则声明此结构的数组,那么您需要向结构的末端以正确对齐。否则 vec4 InnerColor 将在数组中第一个元素之后的错误边界上开始(请参阅下面链接的文档中的规则 10)

所有这些都在 7.6.2.2 Standard Uniform Block Layout 中进行了更正式的讨论。 OpenGL 4.5 规范。

关于c++ - OpenGL 中的统一 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32016422/

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