在OpenGL中通常如何处理多着色器渲染器?

6qfn3psc  于 2022-11-04  发布在  其他
关注(0)|答案(2)|浏览(151)

假设我的引擎中有一些渲染器,我希望它能够渲染一些网格。这些网格中的每一个都可能需要用不同的着色器来渲染:一个需要Phong,另一个需要PBR,另一个可能是单元着色...这意味着我需要一个具有环境光、漫反射、镜面反射的PhongMaterial,以及一个具有反照率、金属的PBRMaterial...基本上,每种类型的着色器都需要不同类型的材质(除非我使用一些具有模糊属性名称的超级材质,如“texture 0”、“texture 1...”)
因此,与其将Shader作为参数传递给渲染器,不如创建PhongRenderer和PBRenderer以及更多的渲染器,每种材质/材质类型都有一个。这与OpenGL项目中通常的操作方式类似吗?粒子系统渲染器是这样处理的吗?

xam8gpfp

xam8gpfp1#

你可以这样想:OpenGL只处理批量提交的点、线或三角形的绘制,一次一个。绘制的方式由状态机控制。状态向量元素之一是所使用的着色器程序。
在渲染一个帧时,使用OpenGL多次切换状态是完全正常的,甚至是意料之中的;也可以在绘制调用之间使用着色器。
然而,切换着色器可能会带来一些沉重的开销;特别是早期的可编程GPU和它们的早期驱动程序。这就是为什么会出现超级着色器,这样就可以通过一个绘制调用来调度更多的几何图形,同时支持多种材质。但在当前一代的GPU中,(截至2022年初撰写本文时)由于GPU设备生成的命令,这一问题得到了缓解。即,提交较大的几何批处理,该命令切换着色器并发出绘制调用。

kwvwclae

kwvwclae2#

正如你在评论中所说,没有明确的答案。
大多数项目使用至少几十个着色器(如果不是几百个的话),这取决于项目,并且它们是如何组织的取决于项目。
为了回答你的例子,正如你可能知道Phong,PBR和单元着色需要完全不同的设置,我会为每个单独的渲染函数。至少你可以重用顶点和索引,但我认为这是唯一的东西,你可以共享这三个完全不同的渲染。
对于稍微不同的着色器来说,使用着色器作为输入的渲染函数是有意义的。2例如,Phong有单光源和多光源。3即使这样,也需要仔细的实现,因为每个着色器需要不同的统一或其他类型的设置。

相关问题