Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ OpenGL VAO VBO着色器混乱_C++_Opengl_Glsl_Vbo_Vao - Fatal编程技术网

C++ OpenGL VAO VBO着色器混乱

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

我正在编写一个渲染器,并且正在选择处理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中是否可能有多个交错格式。

将VAO与不同的着色器一起重用是一种很好的做法

但是,与切换着色器相比,切换VBO和VAO通常非常便宜。这意味着在您的情况下,瓶颈可能是切换着色器

出于同样的原因,将所有网格放在同一个VBO中可能有点过头了(但只要不需要更新它,就不会有什么坏处)

此外,根据渲染的内容,按深度/混合状态或按深度(通常是从前到后)排序绘制调用可能比按着色器排序更好。但这需要仔细衡量。(有关排序的更多信息)


编辑:要回答第二个问题,可以在同一VBO中放置不同类型的顶点,尽管我从未尝试过。这很棘手,因为需要小心顶点对齐。例如,当调用
glDrawArrays(mode,first,count)
时,您需要计算
first
,以便
first*sizeof(YourCurrentVertexType)
等于将数据放入VBO的偏移量。无论如何,这样做可能不是个好主意。一些司机可能不喜欢它,正如我上面所说的,它可能不会产生明显的影响。

f这个解决方案是最优的,没有人知道。如果减少对绑定VAO和程序的调用量是最好的,我会对thoughthx的一些专家意见感兴趣,然后我会尝试一下。我只是想知道在实现“一个VBO连续存储所有网格”之前,我对VBO/VAO的总体思路是否正确。。。根据数据更改的频率将数据分组到缓冲区中。如果某些数据每帧都发生更改,那么它可能不应该与静态数据位于同一个缓冲区中。