我们绘制了1000个陨石,如果我们将数量提升到 2000 个,会怎么样?

在编译 shader 的时候就会报错:

那要怎么样才能知道 UBO 最大的大小限制呢?

获取 单个UBO大小 的最大限制

使用 glGetIntegerv 接口即可,传入:GL_MAX_UNIFORM_BLOCK_SIZE

 // GL_MAX_UNIFORM_BLOCK_SIZEGLint 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的 shader : HLSL 数据类型),也就是 4x4=16 个 float

一个 float = 4 bytes,所以 mat4 = 16 * 4 个 bytes = 64 个 bytes

那么 1000 个 mat4 就是 1000 * 64 = 64000 bytes ,已经相当接近 65536 了,

那么我们可以通过 MaxUBOSize : 65536 除以单个 mat4 需要的字节(64字节),就可以知道我们的硬件最大可以给单个 UBO 分配多大的大小:

65536 / 64 = 1024,所以我的硬件是只支持单个 UBO 最多 1024个 mat4 的大小,也就是 64 KB 的大小

OK,我测试后,1024 个实例化是没有 shader 编译错误问题的

那么为了测试,我改为 1025 个后,也出现了上面的大小限制的问题了

上面的示例中,只是在 UBO 中使用了一个 mat4 的属性,如果还有其他的颜色,或是其他的属性,那么 UBO 的大小限制很快就成为最大的问题的

那么 UBO 的方式限制这么大,我们在一些场景中的绘制实例数量会大大超过这个数量,有些甚至到达 10万个,或以上

除了 UBO 大小之外,不知道大家没有发现,这种方式,还需要对 glsl Shader 层的 UBO指定固定大小

使用起来很不方便,这个数量很大时候取决于应用层的实例数量而动态变化大小的,虽然可以将 UBO 设置大些,但 UBO 大小本身有限制,而且不同硬件限制大小还不一样,如,我这个笔记本,1024 个 mat4 的大小(64KB)就到顶了

所以使用 UBO 的方式限制问题还是很大的。

OpenGL中的Uniform block size 的大小限制相关推荐

  1. 【问题】HDFS中块(block)的大小为什么设置为128M?

    一.为什么HDFS中块(block)不能设置太大,也不能设置太小? 如果块设置过大, 一方面,从磁盘传输数据的时间会明显大于寻址时间,导致程序在处理这块数据时,变得非常慢: 另一方面,mapreduc ...

  2. 磁盘的块大小(Block Size)和扇区大小(Sector Size)

    来源:http://chenjianjx.iteye.com/blog/1806258 Logical Block Size:A "block", a contiguous num ...

  3. linux硬盘扇区大小,磁盘的块大小(Block Size)和扇区大小(Sector Size)

    Logical Block Size:A "block", a contiguous number of bytes, is the minimum unit of memory ...

  4. linux查看block大小命令,Linux/Centos下多种方法查看系统block size大小

    例如: tune2fs -l /dev/hda1 |grep "Block size" Block size:               4096 另一个工具dumpe2fs也可 ...

  5. 【OpenGL4.0】GLSL-使用Uniform Block实现着色器的数据共享

    一.在GLSL中使用Uniform Block 在GLSL渲染语言中,我们经常采用缓冲区来存储Uniform型的Block. 比如我们需要绘制下面这样的效果: 在这里我们绘制了一个圆,圆内部颜色和外部 ...

  6. 中间件事务码R3AC1里Block Size的含义

    2019独角兽企业重金招聘Python工程师标准>>> 在中间件事务码R3AC1可以为一个中间件的适配器对象维护Block size的大小. 以上图的尺寸为50为例,假设在ERP系统 ...

  7. R语言ggplot2可视化分面图(facet_wrap)、使用size参数自定义设置分面图标签栏(灰色标签栏)中的标签文本的字体大小

    R语言ggplot2可视化分面图(facet_wrap).使用size参数自定义设置分面图标签栏(灰色标签栏)中的标签文本的字体大小 目录

  8. matlab legend对齐,MATLAB中不正确的图例框大小?(Improper legend box size in MATLAB?)

    MATLAB中不正确的图例框大小?(Improper legend box size in MATLAB?) 我遇到了一个问题,即字体大小更改时图例框不会自动调整大小. x = [1 4 6 8 0 ...

  9. block size在equipment download中的用法

    Created by Jerry Wang, last modified on Sep 24, 2014 R3AC1里默认的block size为50: 将其改为1,保存. 在R3AR2的reques ...

最新文章

  1. 【数据结构】顺序表的应用(3)(C语言)
  2. 新建站点如何与服务器,新建站点如何收录更快
  3. 如何配置IIS日志信息
  4. 基于Spring Security的认证方式_实现授权功能_Spring Security OAuth2.0认证授权---springcloud工作笔记120
  5. ios上传闪退 php,iOS应用上架后出现闪退原因浅析
  6. 有效预防xss_4类防御XSS的有效方法
  7. 详解:Drools规则引擎探究以及在IOT的应用
  8. 用74HC595和74LS247驱动四位数码管
  9. java 俄罗斯方块原理,俄罗斯方块设计原理
  10. 新一代的核心路由器的发展趋势分析
  11. 中国大学慕课python测验八答案_中国大学慕课Python编程基础章节测验答案
  12. macOS Mojave(软件篇):微信 for Mac 防撤回插件(WeChatTweak-macOS)
  13. python往npy写入数据_操作python实现npy格式文件转换为txt文件
  14. word2vec训练中文词向量
  15. Oracle:cost耗费高的sql执行比cost耗费慢的效率快
  16. 图文深度解析Linux内存碎片整理实现机制以及源码
  17. nginx-vts监控模块
  18. 华盛顿大学计算机科学,华盛顿大学计算机科学与信息系统Computer Science and Information Systems世界排名2020年最新排名第18位(QS世界排名)...
  19. c语言实现键盘按键,【视频】C语言实现键盘记录【c语言吧】_百度贴吧
  20. 在html中页面打开次数计算,实现页面访问次数统计

热门文章

  1. verilog实现步进电机脉冲分配器(三相六拍)基于Nexys4DDR开发板
  2. linux系统下4k对齐,linux查看硬盘4K对齐方法
  3. 单片机方波幅度调节c语言,为什么我用单片机做的频率可调的方波输出会有尖刺,而且会断...
  4. think php框架 跨域,ThinkPHP框架实现session跨域问题
  5. 控制台怎么查看错误的详细信息_Java 程序该怎么优化?命令篇
  6. 北邮 复习 软件工程_软件工程期末复习北邮
  7. android:layout_width=0.0dip,【教程】状态栏显示网速
  8. python拼图游戏代码_GitHub 上哪些勾起回忆的经典小游戏(Python)
  9. 洛谷 P1494 [国家集训队]小Z的袜子
  10. Centos 解压命令