我正在为iOS,Windows和OS X开发一款跨平台游戏。现在我正在为我的图形编写所有着色器。所以这就是问题:
如果我为游戏的移动版本(我开发的拳头)使用了GL ES 2.0着色器(#version 100
),我是否应该在更现代版本的桌面GLSL中重写它们(如{{1}对于桌面游戏端口,或者我应该直接使用这些着色器?我在测试应用程序的桌面环境中测试了ES 2.0着色器,它们似乎运行良好。
那么(一般来说)我是否会从更现代的GLSL版本中重写着色器中获益?我不是在谈论为移动/桌面优化着色器代码本身,这是相当明显的,我当然会这样做。我说的是在不同的平台上使用不同的GLSL语言版本。是否有任何性能差异,兼容性问题或任何类似的东西,这是将ES 2.0着色器移植到桌面上更现代版本的足够理由?
由于我们正在谈论2D游戏的相当简单的着色器,我不会真正受益于更现代的桌面GLSL版本的额外功能和更好的API。 #version 330
已经足够完成工作,它对我来说很好。所以更现代的功能,我可以没有。除此之外,有没有理由不在桌面上使用#version 100
?
答案 0 :(得分:3)
那么(一般来说)我是否会从更现代的GLSL版本中重写着色器中获益?我不是在谈论为移动/桌面优化着色器代码本身,这很明显,我当然会这样做。我正在讨论在不同平台上使用不同的GLSL语言版本。是否有任何性能差异,兼容性问题或任何类似的东西,这是将ES 2.0着色器移植到桌面上更现代版本的充分理由?
表现,不,不是真的。
precision
限定符会混淆旧版本的GLSL,但其他所有内容都应该正常移植而不需要重写。据了解,桌面GLSL中的precision
仅用于兼容性,并且它对更高版本的添加不会阻止解析错误。它不会改善性能或任何类似的东西。
您可能被迫显着重写着色器的唯一原因是您要尝试将软件移植到OS X上的 core 配置文件中。您必须使用GLSL 1.30+语法在那种情况下。
所以更现代的功能,我可以没有。除此之外,有没有理由不在桌面上使用#version 100?
从技术上讲,桌面GL中不存在#version 100
。在GL 2.0之前有一个模糊定义它的扩展,但通常你会假设在桌面GL中GLSL版本编号从110开始.GLSL ES版本100在语法和功能上实际上更接近桌面GLSL 120,但有一个很少有额外的东西,例如桌面GLSL很长一段时间都不理解的precision
。
至少你必须重写#version
指令。如果你告诉他们针对GLSL 1.00编译着色器,大多数桌面GLSL编译器都不会喜欢它。
答案 1 :(得分:3)
在制作跨平台着色器时,我们发现大多数简单着色器都能正常工作。
当您需要针对移动设备优化这些着色器时,一个调用端口是使用精度限定符(lowp
/ mediump
/ highp
)来降低精度。
但是,如果没有在着色器顶部添加#version 130
,这些将无法在桌面glsl上进行编译。
但是,添加它会破坏移动设备上的着色器。
我们发现的平衡是使用精确限定符优化移动着色器。在桌面平台上的着色器加载代码中,我们在每个着色器的顶部插入以下行:
#define lowp
#define mediump
#define highp
这使用预处理器消除了这些定义。这有效地绕过了桌面上的这种优化,但正如Andon M. Coleman所说的那样,他们无论如何都不会做任何事情。
如果任何着色器特别复杂,我建议使用可以考虑硬件优缺点的单独着色器。