【发布时间】:2015-01-13 07:21:29
【问题描述】:
我正在编写一个渲染器,并且正在选择一种最终方法来处理 vao/vbo/shader 管理。在网上,我发现关于实际推荐的信息高度矛盾。 目前思路如下:
-一个VBO连续存储所有网格。
-每个“着色器映射”创建一个 VAO 以将特定的指针映射存储到 VBO。 (“着色器映射”,在具有相同输入的不同着色器中保持一致)
然后通过“着色器映射”对实体进行排序,并使用主 VBO 中的偏移量进行渲染,从而最大限度地减少着色器和 VAO 开关。比如:
for(shaders by mapping)
bindVAO(); //set pointers
for(shader)
for(entity using shader)
entity.setUniforms();
drawArrays(entity.offset, entity.size);
因为这将包括大量的重构,所以我想问一下这个解决方案是否是最优的。 我还想知道是否可以在单个 VBO 中具有多种交错格式。
【问题讨论】:
-
如果这个解决方案是最优的 - 没有人知道。您必须对其进行概要分析。
-
afaik 减少对绑定 vaos 和程序的调用量是最好的,不过我会对更多专家意见感兴趣
-
谢谢,那我就试试。在实施之前,我只是想知道我对 VBO/VAO 的总体思路是否正确。
-
“一个 VBO 连续存储所有网格”...根据数据更改的频率将数据分组到缓冲区中。如果某些数据每帧都发生变化,那么它可能不应该与静态数据在同一个缓冲区中。