C++ OpenGL VAO VBO着色器混乱
我正在编写一个渲染器,并且正在选择处理vao/vbo/shader管理的最终方法。在网络上,我发现关于实际推荐内容的信息非常矛盾。 目前的想法如下:C++ OpenGL VAO VBO着色器混乱,c++,opengl,glsl,vbo,vao,C++,Opengl,Glsl,Vbo,Vao,我正在编写一个渲染器,并且正在选择处理vao/vbo/shader管理的最终方法。在网络上,我发现关于实际推荐内容的信息非常矛盾。 目前的想法如下: -一个VBO连续存储所有网格 -根据“着色器映射”创建VAO以将特定指针映射存储到VBO中。(“着色器映射”,在具有相同输入的不同着色器中保持一致) 然后通过“着色器映射”对实体进行排序,并在主VBO中使用偏移进行渲染,从而最小化着色器和VAO开关。比如: for(shaders by mapping) bindVAO(); //set p
-一个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中是否可能有多个交错格式。将VAO与不同的着色器一起重用是一种很好的做法 但是,与切换着色器相比,切换VBO和VAO通常非常便宜。这意味着在您的情况下,瓶颈可能是切换着色器 出于同样的原因,将所有网格放在同一个VBO中可能有点过头了(但只要不需要更新它,就不会有什么坏处) 此外,根据渲染的内容,按深度/混合状态或按深度(通常是从前到后)排序绘制调用可能比按着色器排序更好。但这需要仔细衡量。(有关排序的更多信息)
编辑:要回答第二个问题,可以在同一VBO中放置不同类型的顶点,尽管我从未尝试过。这很棘手,因为需要小心顶点对齐。例如,当调用
glDrawArrays(mode,first,count)
时,您需要计算first
,以便first*sizeof(YourCurrentVertexType)
等于将数据放入VBO的偏移量。无论如何,这样做可能不是个好主意。一些司机可能不喜欢它,正如我上面所说的,它可能不会产生明显的影响。f这个解决方案是最优的,没有人知道。如果减少对绑定VAO和程序的调用量是最好的,我会对thoughthx的一些专家意见感兴趣,然后我会尝试一下。我只是想知道在实现“一个VBO连续存储所有网格”之前,我对VBO/VAO的总体思路是否正确。。。根据数据更改的频率将数据分组到缓冲区中。如果某些数据每帧都发生更改,那么它可能不应该与静态数据位于同一个缓冲区中。