让我们在着色器中声明一个大的接口块:
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];
使用小缓冲区进行备份是非法的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句