gpt4 book ai didi

opengl - glBindBufferRange() OpenGL 3.1 的问题

转载 作者:行者123 更新时间:2023-12-04 17:52:57 27 4
gpt4 key购买 nike

我的顶点着色器是

uniform Block1{    vec4 offset_x1;   vec4 offset_x2;}block1;

out float value;

in vec4 position;

void main()
{
value = block1.offset_x1.x + block1.offset_x2.x;

gl_Position = position;
}

我用来传递值的代码是:
GLfloat color_values[8];// contains valid values

glGenBuffers(1,&buffer_object);

glBindBuffer(GL_UNIFORM_BUFFER,buffer_object);

glBufferData(GL_UNIFORM_BUFFER,sizeof(color_values),color_values,GL_STATIC_DRAW);

glUniformBlockBinding(psId,blockIndex,0);

glBindBufferRange(GL_UNIFORM_BUFFER,0,buffer_object,0,16);

glBindBufferRange(GL_UNIFORM_BUFFER,0,buffer_object,16,16);

这里我期望的是,为每个 vec4 制服传递 16 个字节。我得到偏移量 = 16 的 GL_INVALID_VALUE 错误,大小 = 16。
我对偏移值感到困惑。 Spec说它对应于“buffer_object”。

最佳答案

有一个alignment restriction绑定(bind)时用于 UBO。任意 glBindBufferRange/Base的偏移量必须是 GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT 的倍数.这种对齐可以是任何东西,因此您必须在构建统一缓冲区数组之前对其进行查询。这意味着您不能直接在编译时 C++ 逻辑中执行此操作;它必须是运行时逻辑。

说到在运行时查询事物,您的代码在许多其他方面都被严重破坏了。您没有为统一 block 定义布局限定符;因此,使用默认值:shared .如果没有 querying the layout of each block's members from OpenGL.,您将无法使用 `shared* 布局。曾经。

如果您进行了查询,您会很快发现您的统一 block 大小至少为 32 个字节,而不是 16 个。而且由于您只提供了 16 个字节在您的范围内,未定义的行为(包括程序终止的可能性)结果.

如果您希望能够定义精确映射到统一 block 定义的 C/C++ 对象,您需要使用 std140布局并遵循std140的规则的布局在您的 C/C++ 对象中。

关于opengl - glBindBufferRange() OpenGL 3.1 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13028852/

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