我们绘制了1000个陨石,如果我们将数量提升到 2000 个,会怎么样?
在编译 shader 的时候就会报错:

那要怎么样才能知道 UBO 最大的大小限制呢?
获取 单个UBO大小 的最大限制
使用 glGetIntegerv 接口即可,传入:GL_MAX_UNIFORM_BLOCK_SIZE
// GL_MAX_UNIFORM_BLOCK_SIZE
GLint maxUniformBlockSize;
glGetIntegerv(GL_MAX_UNIFORM_BLOCK_SIZE, &maxUniformBlockSize);
std::cout
<< "Maximun number of Uniform Block Size : "
<< maxUniformBlockSize
<< std::endl;
输出:Maximun number of Uniform Block Size : 65536
注意不同的硬件中,这个限制大小是不同的,这里是我的笔记本上的测试结果
这个:65536 大小的单位是:字节
uniform Instancing_UBO {
mat4 instancingMat[1000]; // instancing 矩阵
};
从上面 shader 代码可以看到 UBO 中有一个 mat4 的数组成员,数组大小为1000,一个 mat4 就是相当于 4个 vec4
每个 vec4 也就是 4个 float
所以一个 mat4 相当于 float4x4(DX的

本文探讨了如何在提升陨石实例数量到2000时遇到UBO大小限制,通过计算发现单个UBO大小限制在65536字节。作者介绍了如何确定硬件限制,并分析了UBO在实例化大量矩阵时的局限性,提出了使用UBO的挑战及替代方案。
最低0.47元/天 解锁文章
9233

被折叠的 条评论
为什么被折叠?



