首页 > 解决方案 > 接口块大小可以大于 Opengl 中的底层 UBO 吗?

问题描述

让我们在着色器中声明一个大接口块:

struct InstancingData
{
    // whatever
};

#define LARGE_SIZE 1048576
layout(std140, row_major, binding = 0) uniform InstanceBlock
{
    InstancingData data[LARGE_SIZE];
};

然后我想绑定一个小的 UBO,包含少于这个块LARGE_SIZE的条目。InstancingData它可以是glBingBufferBase一个小数组,也可以是glBindBufferRange一个较大数组中的一个小范围。

因此,我将data仅使用小于底层缓冲区大小允许的索引进行索引,使用适当的统一或gl_VertexID. 所以正式它不应该导致访问冲突。

这些操作会在任何 OpenGL 版本中触发错误或未定义的行为吗?

另一种方法:

我宣布

InstancingData data[1];

然后我绑定了一个包含 42 个结构的缓冲区并索引了所有这些结构(实例模型的 6x7 方形床),它在我的机器上运行良好。是否保证可以在任何地方工作?

标签: openglglsllanguage-lawyer

解决方案


ARB_uniform_buffer_object

如果任何活动的统一块没有足够大的缓冲区对象支持,则着色器执行的结果是不确定的,并可能导致 GL 中断或终止。

这足以说明InstancingData data[LARGE_SIZE];使用小缓冲区进行备份是非法的。


推荐阅读