GLSL和GLSL ES 2之间的差异

时间:2012-04-30 11:42:10

标签: glsl opengl-es-2.0

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

  1. GLSL ES 2是一种完全独立的语言,还是GLSL的特殊版本?
  2. 就“标准库”功能,语法和功能而言,它们之间有什么区别?
  3. 我正在为针对Windows,Mac和iPad的应用程序编写着色器,我宁愿不必为每个着色器添加更多版本 - 无论如何都要更简单的着色器。

2 个答案:

答案 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 架构的差异。

  • ImgTech PowerVR SGX - TBDR (TileBasedDeferred)
  • ImgTech PowerVR MBX - TBDR(固定功能)
  • ARM Mali - 瓷砖(小瓷砖)
  • Qualcomm Adreno - 瓷砖(大瓷砖)
  • Adreno3xx - 可以切换到繁体
  • glHint(GL_BINNING_CONTROL_HINT_QCOM, GL_RENDER_DIRECT_TO_FRAMEBUFFER_QCOM) NVIDIA Tegra - 传统