2015-06-23 34 views
1

通常在着色器中启用OpenGL ES扩展就会导致性能损失?启用OpenGL ES扩展会有性能损失吗?

我工作的一些代码,注入各种扩展到能够对所有着色器的着色器源代码,而不管特定着色器是否需要该扩展。这可能会有性能损失吗?从概念上讲,它似乎不太可能。

我特别感兴趣的是iOS。

回答

1

在着色器执行的条款,只要需要的延伸不具有任何影响。着色器被编译为GPU兼容格式,并且#extension(作为预处理器令牌)不会对生成的输出产生任何影响。您可以验证在其他GLES平台(例如Android)上产生的输出的等效性,其中glGetProgramBinaryOES可用,并将生成的着色器与没有使用#extension预处理器的比较。

的GLSL解析器将有一些额外的工作要做解析着色器。这对于单个着色器来说不太可能会有额外的处理时间,但它依赖于驱动程序的着色器编译器。如果您的着色器数量非常大,则累积的额外工作量可能会很大。在这种情况下,删除#extension语句可能会对您的着色器实际上不需要它们有好处。

具体为iOS,着色器编译被散列,使得二进制文件被自动甚至跨应用程序的会话保存的着色器后面的编译。这意味着在应用程序的第一次运行中,只需“支付”解析器的成本(除非着色器是动态的),从而使解析器的性能不再成为问题。在Android上这不是真的,因为必须使用glGetProgramBinaryOESglProgramBinaryOES明确加载程序二进制文件才能获得相同的行为。

也就是说,需要一个扩展意味着你将要使用它,这可能会对依赖着色器上扩展它是一个很大的影响,而你用它做什么。该list of iOS GLES extensions包括由#extension声明(EXT_draw_instancedEXT_shader_texture_lodEXT_shader_framebuffer_fetch ...)启用一些。很容易想象,使用EXT_shader_framebuffer_fetch扩展对帧缓冲区进行采样的着色器执行所需的时间比等效的着色器执行时间要长。

+0

感谢您的详细解答。在最后一段中,是否只有在使用扩展时才会得到这种潜在的性能影响? – combinatorial

+0

如果您使用扩展功能,显然可能会(显着)影响性能。不使用在预处理器中声明的扩展名不会使您从额外的解析时间中解脱出来(如第2段所述)。 – MuertoExcobito

相关问题