有些东西我对OpenGL并不完全了解:根据我正在阅读的所有内容,通过编译着色器足够长时间将它们附加到程序中,可以获得最佳性能,然后建议您删除着色器本身可以释放内存并只跟踪程序直到它被删除。
所以我的问题是:如果上述情况属实,那么在创建程序后能够附加着色器并重新链接程序的目的是什么?在场景创建期间创建第二个着色器程序并在它们之间交换而不是分离/附加和重新链接程序是不是更有效?
答案 0 :(得分:5)
通过将着色器编译得足够长以将它们附加到程序中来获得最佳性能,然后建议您删除着色器本身以释放内存并只跟踪程序直到它被删除
此活动与渲染效果无关;它可能有助于减少驱动程序的内存使用量,但它不会帮助您更快地在屏幕上显示三角形。编译着色器的过程是在编译程序之后建模的,并且您的注释与在编译完整可执行文件后删除目标文件相同。
在程序创建后能够附加着色器并重新链接程序的目的是什么?
这使您可以跳过重新编译程序所需的所有着色器,并仅重新链接已编译的着色器(与链接的着色器程序不同)以创建新程序。再次使用并行构建可执行文件,就像使用一组不同的目标文件来创建一个新的可执行文件。您无需从源代码重新编译所有内容,只需将相应的文件提供给链接器即可。
在场景创建期间创建第二个着色器程序并在它们之间交换而不是分离/附加和重新链接程序是不是更有效?
当然,这是业内许多人的想法。虽然性能取决于您正在使用的OpenGL驱动程序实现,但常识会建议将新着色器“加载”到管道中比更新状态以配置着色器程序链接,执行链接,然后更快“加载”新的着色器。