一般来说,只是在着色器中启用OpenGL ES扩展会导致性能下降吗?
我正在研究一些代码,这些代码将各种扩展的启用注入所有着色器的着色器源代码,无论特定着色器是否需要该扩展。这可能会导致性能下降吗?从概念上讲,似乎不太可能。
我对iOS特别感兴趣。
答案 0 :(得分:1)
就着色器执行而言,仅仅需要扩展名没有任何效果。着色器被编译为GPU兼容格式,#extension
(作为预处理器令牌)不会对生成的输出产生任何影响。您可以在glGetProgramBinaryOES
可用的其他GLES平台(例如Android)上验证生成的输出的等效性,并将生成的着色器与没有#extension
预处理器的生成器进行比较。
GLSL解析器将有一些额外的工作来解析着色器。对于单个着色器来说,这不太可能是额外的大量处理时间,但它确实取决于驱动程序的着色器编译器。如果您有非常多的着色器,这个累积的额外工作可能会变得很重要。在这种情况下,当着色器实际上不需要删除#extension
语句时,可能会有一些好处。
特别是对于iOS,着色器编译被散列,以便自动存储二进制文件以用于后续的着色器编译,甚至跨应用程序会话。这意味着您只需在第一次运行应用程序时“支付”解析器的成本(除非您的着色器是动态的),这使得解析器的性能不再受到关注。在Android上不是这样,必须使用glGetProgramBinaryOES
和glProgramBinaryOES
显式存储和加载程序二进制文件才能获得相同的行为。
那就是说,要求扩展意味着你将使用它,这可能会对着色器产生很大的影响,具体取决于它是什么扩展,以及你正在做什么。 list of iOS GLES extensions包含一些#extension
语句(EXT_draw_instanced
,EXT_shader_texture_lod
,EXT_shader_framebuffer_fetch
,...)启用的内容。很容易想象,使用EXT_shader_framebuffer_fetch
扩展名对帧缓冲区进行采样的着色器执行的时间比等效的着色器需要更长的时间。