我应该以编译形式还是纯文本形式分发着色器?


13

如果有一个使用使用GLSL编写的着色器的应用程序,那么在现实世界中以及在桌面和移动设备上进行分发的最佳策略是什么?

我的目标是以二进制形式或纯序列化文本的形式分发,我希望对此提出一个好的建议。

Answers:


15

使用二进制着色器的主要理由是,如果编译文本着色器对于目标设备来说工作量太大。二进制GLSL着色器没有标准格式,因此对于计划支持的每个GPU /驱动程序,您都需要不同的格式。我建议您以源代码形式分发着色器,然后在第一次运行时将其缓存为二进制形式,然后从那里加载。再一次,我将首先测试您是否真的存在性能瓶颈,以证明根本无法使用二进制文件。

还需要考虑的一件事是,脱机文本着色器优化器可以对笨拙的移动着色器编译器产生很大的影响。


如果您能找到着色器编译成为瓶颈的任何设备,我实际上会感到惊讶。就编译而言,即使在大型着色器中,代码量也是微不足道的。
edA-qa mort-ora-y 2012年

1
正如Tapio建议的那样,大型引擎通常会脱机编译着色器和/或在第一次运行时将其缓存。每个着色器可能有少量的代码,但是您可以拥有很多
洛朗·库维杜

所以我必须从Nvidia购买一个随机的ATI视频卡和另一个随机的显卡,编译我的着色器并仅分发编译后的版本?我如何在运行时检查目标视频卡的品牌?有可靠的东西吗?
user827992 2012年

1
@ user827992即使供应商相同,二进制格式对于不同代的GPU /驱动程序也可能不同。另外,别忘了还有很多Intel GPU,更不用说所有移动设备了,例如Qualcomm和PowerVR。再说一遍:我建议您不要分发已编译的着色器,而是在用户设备上首次运行时将其缓存。关于GPU检测,您可以尝试从glGetString()解析GL_VENDOR,GL_VERSION和GL_RENDERER字符串,但是它们的格式因供应商而异。
Tapio 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.