GLSL和GLSL ES 2之间的差异

Mr.*_*Boy 29 glsl opengl-es-2.0

两个问题真的......

  1. GLSL ES 2是完全独立的语言,还是GLSL的特殊版本?
  2. 在"标准库"功能,语法和功能方面,它们之间有什么区别?

我正在为针对Windows,Mac和iPad的应用程序编写着色器,我宁愿不必添加每个着色器的更多版本 - 无论如何更简单的着色器.

Nic*_*las 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.
Run Code Online (Sandbox Code Playgroud)

您的桌面GLSL 1.20前言如下所示:

#version 120
#define lowp
#define mediump
#define highp
Run Code Online (Sandbox Code Playgroud)

或许其他一些明智的#defines.这样,您的着色器可以设置这些精度限定符,并且#define在使用桌面GLSL时它们就会消失.

这与C/C++中的平台中立编码非常相似,在这种情况下,您通常会有一些特定于平台的标头,这些标头会更改定义和/或#define您可以根据需要调整代码.

  • "不包含#version指令的着色器将被视为目标版本1.10.指定#version 100的着色器将被视为OpenGL ES着色语言的目标版本1.00,它是版本1.50的严格子集." 从ES2兼容性 (2认同)