繁体   English   中英

在OpenGL引擎中组织GLSL着色器

[英]Organizing GLSL shaders in OpenGL engine

哪个更好 ?

  1. 要使一个着色器程序具有大量指定要使用的灯光或要进行映射的制服 (例如,我需要对一个网格进行视差映射,而对另一个进行视差/镜面映射)。 我会为惰性传输创建一个统一的缓存列表,如果需要,只需为每个下一个网格更改几个统一即可。

  2. 对于每种需要的情况, 要有很多着色器程序 ,每个都有少量的均匀性,并在需要时对每个网格使用glUseProgram进行延迟绑定。 在这里,我假设网格已正确批处理,以避免冗余开关。

我知道的大多数现代引擎都具有“着色器缓存”,并使用第二个选项,因为它显然更快。

您也可以看一下允许动态链接的ARB_shader_subroutine。 但是我认为它仅在DX11类硬件上可用。

通常,除非您有大量程序,否则选项2会更快/更好。 您还可以使用跨程序共享的缓冲区对象,这样,在更改程序时无需重置任何值。

此外,一旦链接了程序,就可以释放链接到程序的所有着色器。 这将释放驱动程序保留的所有源代码和所有预链接信息,仅将完全链接的程序保留在内存中。

我倾向于相信这取决于特定的应用程序。 是的,因为说运行100个程序会更有效,每个程序可能都有大约2-16个制服。 最好在两者之间进行权衡。 我倾向于认为,针对您最常用的着色技术说出10到20个程序就足够了,甚至更多。 例如,您可能希望有一个程序/着色器来完成所有凹凸贴图,一个要执行所有雾化效果,一个要进行反射,一个要进行折射。

现在,在您的问题范围之外,我认为这也将在此处涉及,要整合到您的引擎中的一件事将是BatchProcess和BatchManager类设置,以减少CPU数量-通过总线进行GPU调用,因为这也将证明是有效的。 我认为没有一个“万能解决方案”适合您的问题,因为我认为这将是针对特定应用的,就像建立您的引擎需要多少个顶点(原始)和多少个顶点(原始)之间的关系一样这些批处理中的每一个都包含一个顶点。

为了使这一点更加清楚:一个游戏可能有4个容器或批次,其中每个批次最多可以容纳10,000个顶点,在BatchManager决定清空该存储桶之前,将所有这些顶点发送到图形卡对于要处理和绘制的渲染管线,其中不同的游戏可能具有10个带有5,000个顶点的存储桶,或者另一个游戏可能具有8个具有12,0000个顶点的存储桶。

因此,尝试根据您的需要将两者结合起来可能会有所取舍。 如果您有一个带有100多个制服的单一程序; 单个程序在管道中更易于管理,但是着色器的读取和管理将非常繁琐。 然后再次使用具有很少制服的着色器是很容易阅读和管理的,但是在链接并发送它们以正确渲染之前,要在CPU上管理100多个程序要困难一些。 我个人将尝试找到一个中间立场,在那里我有足够的程序来完成彼此完全不同的每个特定任务,例如在一个程序上执行雾密度,而在另一个程序上执行体积阴影映射,而每个程序都具有足够的制服来执行所需的计算。

然后,下一步是进行一些基准测试,以查看效率和开销在哪里平衡以进行适当的调整。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM