我目前正在计划一个渲染器,我有2种不同的方法可以处理着色器。我为他们写了pseduo代码:
示例A
for all models {
bind all vertex data for the model
for each shader on this model {
set shader
upload uniforms
draw indicies for this shader
}
}
例B
for all models {
collect geometry and seperate it by shader
}
sort geometry by shader into groups
for all shaders {
set shader
upload uniforms
draw geometry group for this shader
}
示例A的优点是我们只需要上传顶点数据一次,并且它共享所有几何体。这样做的缺点是我必须不断更改着色器并将制服上传到它。
示例B的优点是我可以通过着色器对整个场景中的所有几何体进行排序,因此我只需要为整个绘制应用每个着色器1次。这也意味着我会在任何给定的时间在绘图堆栈上有更多,所以空闲时间更少"完成着色器绘制后的时间。
哪种方式最终会在性能上更好?根据我所读到的内容,我倾向于实例B,但我想更多地了解它。