0

OpenGL 有一些我不完全理解的东西:根据我正在阅读的所有内容,通过将着色器编译足够长的时间以将它们附加到程序中,您可以获得最佳性能,然后建议您删除着色器本身以释放内存并跟踪程序直到它被删除。

所以我的问题是:如果上述情况属实,那么在创建程序后能够附加着色器并重新链接程序的目的是什么?仅创建第二个着色器程序并在场景创建期间在它们之间交换而不是分离/附加和重新链接程序不是更有效吗?

4

1 回答 1

5

通过将着色器编译到足以将它们附加到程序的时间来获得最佳性能,然后建议您删除着色器本身以释放内存并跟踪程序直到它被删除

此活动与渲染性能无关;它可能有助于减少驱动程序的内存使用量,但不会帮助您更快地在屏幕上显示三角形。编译着色器的过程是在编译程序之后建模的,您的注释与在编译完整的可执行文件后删除目标文件相同。

在创建程序后能够附加着色器并重新链接程序的目的是什么?

这使您可以跳过重新编译程序所需的所有着色器,而仅重新链接已编译的着色器(与链接的着色器程序不同)以创建新程序。再次使用并行构建可执行文件,这就像使用一组不同的目标文件来制作新的可执行文件。您不需要从源代码重新编译所有内容,只需将适当的文件输入链接器即可。

仅创建第二个着色器程序并在场景创建期间在它们之间交换而不是分离/附加和重新链接程序不是更有效吗?

当然,这是许多业内人士的想法。虽然性能取决于您使用的 OpenGL 驱动程序实现,但常识表明,将新着色器“加载”到管道中比更新状态以配置着色器程序链接、执行链接、然后“加载”新的着色器。

于 2013-07-05T17:49:13.447 回答