我目前正在规划一个渲染器,有两种不同的方式可以处理着色器。我已经为它们编写了伪代码:
示例 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 的优点是,我们只需要上传一次顶点数据,就可以共享所有几何图形。缺点是我必须不断更改着色器并上传到它的 uniform。
示例 B 的优势在于,我可以按着色器将整个场景中的所有几何图形排序,因此每个着色器只需应用 1 次,即可完成整个绘制过程。这也意味着,在任何给定时间内,我都会有更多的绘制堆栈,因此在一个着色器完成绘制后,"空闲" 时间更少。
哪种方式在性能上最好?基于我所了解的,我倾向于使用示例 B,但我想多学习一些关于它的知识。