2015-06-23 35 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

相關問題