真的有两个问题...
- GLSL ES 2 是完全独立的语言,还是 GLSL 的特殊版本?
- 在“标准库”函数、语法和功能方面,它们之间有什么区别?
我正在为一个针对 Windows、Mac 和 iPad 的应用程序编写着色器,我不希望为每个着色器添加更多版本——无论如何,着色器更简单。
真的有两个问题...
我正在为一个针对 Windows、Mac 和 iPad 的应用程序编写着色器,我不希望为每个着色器添加更多版本——无论如何,着色器更简单。
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
。这样,您的着色器可以设置这些精度限定符,并且#define
在使用桌面 GLSL 时它们将被删除。
这很像 C/C++ 中的平台中立编码,您经常有一些特定于平台的标头来更改定义和/或#define
您可以根据这些标头条件代码。
用更简单的术语来说,Opengl ES 即 opengl 嵌入式系统被设计为可以在手机等嵌入式设备上运行,手机系统面临与 90 年代 pc 相同的问题,即计算问题和 gpu 架构的差异。