opengl - 接口块大小可以大于 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 方形床),它在我的机器上运行良好。是否保证可以在任何地方工作?
解决方案
如果任何活动的统一块没有足够大的缓冲区对象支持,则着色器执行的结果是不确定的,并可能导致 GL 中断或终止。
这足以说明InstancingData data[LARGE_SIZE];
使用小缓冲区进行备份是非法的。