真的有两个问题......
我正在为针对Windows,Mac和iPad的应用程序编写着色器,我宁愿不必为每个着色器添加更多版本 - 无论如何都要更简单的着色器。
答案 0 :(得分:27)
GLSL ES 2是完全独立的语言,还是GLSL的特殊版本?
每个版本的GLSL最终都是“完全独立的语言”;有些甚至不能与以前的版本向后兼容。然而,GLSL的ES变化甚至更多。
将其视为桌面GLSL的分支。 来自六个版本的GLSL的分支,请注意。
在“标准库”功能,语法和功能方面,它们之间有什么区别?
在哪个版本之间?
在这些平台之间尝试共享着色器的唯一可能原因是,如果您尝试在它们之间共享OpenGL代码。因此,您必须限制自己使用桌面OpenGL 2.1功能。
这意味着您将使用桌面GLSL版本1.20。这类似于GLSL ES版本1.00(GLSL的版本没有给出与匹配的GL版本相同的数量。好吧,直到桌面GL 3.3 / 4.0和GLSL 3.30 / 4.00),但仍然不同。在ES中,您有许多桌面GLSL 1.20无法处理的精度限定符。
处理这种情况的最佳方法是使用“前导”着色器字符串。请参阅glShaderSource
获取多个着色器字符串,它将它们拼接在一起并编译为一个。您可以使用主着色器字符串(main
及其各种代码,attribute
定义,uniforms
等)并在其前面添加“前导码”着色器字符串。根据你正在编写的内容,序言会有所不同。
您的ES GLSL 1.00序言如下:
#version 100 //Must start with a version specifier.
您的桌面GLSL 1.20序言如下所示:
#version 120
#define lowp
#define mediump
#define highp
也许还有其他一些明智的#defines
。这样,您的着色器可以设置这些精度限定符,并且在使用桌面GLSL时它们只会#define
d。
这很像C / C ++中的平台中立编码,你经常会有一些特定于平台的标题改变定义和/或有#define
s,你可以根据它来调整代码。
答案 1 :(得分:0)
简单来说,Opengl ES 即 opengl 嵌入式系统是为了在手机等嵌入式设备上运行而设计的,手机系统面临着与 90 年代 pc 相同的问题,即计算问题和 gpu 架构的差异。