将 GL ES 2.0 着色器移植到桌面 GLSL(我应该吗?)

Porting GL ES 2.0 shaders to desktop GLSL (should I?)

我正在为 iOS、Windows 和 OS X 开发一款跨平台游戏。现在我正在编写所有我的图形着色器。那么问题来了:

如果我有适用于移动版游戏(我自己开发的)的 GL ES 2.0 着色器 (#version 100),我是否应该用更现代的桌面 GLSL 版本重写它们(例如 #version 330 或其他)用于游戏的桌面端口,还是我应该按原样使用这些着色器?我在测试应用程序的桌面环境中测试了 ES 2.0 着色器,它们似乎运行良好。

那么我(一般来说)是否受益于在更现代的 GLSL 版本中重写着色器?我不是在谈论为 mobile/desktop 优化着色器代码本身,这很明显,我当然会这样做。我说的是在不同平台上使用不同的 GLSL 语言版本。是否存在任何性能差异、兼容性问题或类似问题,这是将 ES 2.0 着色器移植到桌面上更现代版本的充分理由?

由于我们讨论的是用于 2D 游戏的相当简单的着色器,我不会真正受益于更多现代桌面 GLSL 版本的额外功能和更好的 API。 #version 100 足以完成工作,对我来说效果很好。所以更现代的功能,我可以不用。除此之外,还有什么理由不在桌面上使用 #version 100 吗?

So do I (generally speaking) benefit from rewriting the shaders in a more modern GLSL version? I'm not talking about optimizing the shader code itself for mobile/desktop, that's fairly obvious, I will do that of course. I'm talking about using different GLSL language versions on different platforms. Is there any performance difference, compatibility issue, or anything of that sort, that's a good enough reason for porting the ES 2.0 shaders to a more modern version on desktop?

性能,不,不是真的。

另一方面,兼容性是一个非常实际的问题。

precision 限定符会混淆旧版本的 GLSL,但其他一切都应该可以正常移植,无需任何重写。据了解,桌面 GLSL 中的 precision 只是为了兼容性而提供的,它添加到更高版本中除了防止解析错误之外没有任何作用。它不会提高性能或任何类似的东西。

您可能被迫大量重写着色器的唯一原因是,如果您要尝试将软件移植到 OS X 上的 core 配置文件. 在这种情况下你必须使用 GLSL 1.30+ 语法。

So the more modern functionality, I can do without. Other than that, is there any reason not to use #version 100 on desktop?

从技术上讲,#version 100 在桌面 GL 中不存在。有一个早于 GL 2.0 的扩展对其进行了模糊定义,但通常您假设在桌面 GL 中,GLSL 版本编号从 110 开始。GLSL ES 版本 100 实际上在语法和功能上更接近桌面 GLSL 120,但具有一些额外的东西,例如 precision 桌面 GLSL 很长一段时间不理解。

您至少需要重新编写 #version 指令。如果您告诉他们针对 GLSL 1.00 编译着色器,大多数桌面 GLSL 编译器将不喜欢它。

在制作跨平台着色器时,我们发现大多数简单的着色器在两者上都能正常工作。

当您需要针对移动设备优化这些着色器时,一个方法是使用精度限定符 (lowp/mediump/highp) 降低精度。

但是,如果不在着色器顶部添加 #version 130,这些将无法在桌面 glsl 上编译。

但是,添加它会破坏移动设备上的着色器。

我们找到的平衡是使用精度限定符优化移动着色器。在桌面平台上的着色器加载代码中,我们在每个着色器的顶部插入以下行:

#define lowp
#define mediump
#define highp

这会使用预处理器清除那些定义。这有效地绕过了桌面上的这种优化,但正如 Andon M. Coleman 的回答所说,他们无论如何都不会做任何事情。

如果任何着色器特别复杂,我会建议使用单独的着色器,以考虑硬件的优缺点。