我使用统一缓冲区对象来包含用于不同绘制调用的统一数据“块”。我设置了缓冲区的哪个部分应该被视为绘制调用将使用的“块”的开始glBindBufferRange()
。
但是,在我的机器上存在一个相当大的对齐限制,即 256 字节,因此我上传到 GPU 的源缓冲区在没有平均约 50% 填充的情况下很少会与其对齐(我的着色器倾向于使用很少的制服),并且我通常每帧大约 500 个块 (125kb) 流到 GPU,具体取决于我正在渲染的场景。
alignment
used padding | used padding |
UBO memory: block0_data----------------- | block1_data----------------- | ...
my memory: block0_data block1_data ...
(with no padding)
我应该在使用 上传之前继续填充我的内存glBufferData()
,还是从我紧凑的内存中上传每个“块”,分别使用多个glBufferSubData()
调用?
或者有没有办法在一次调用中将我的客户端数据上传到 GPU 缓冲区,它将用不同的块步长填充?