5

我需要为 Android 编写基于 opengl 的应用程序。

OpenGL SL 和 OpenGL ES 2.0 SL 之间以及 OpenGL 和 OpenGL ES 之间有很大的区别吗?如果我使用一些与通用 OpenGL 相关的书籍而不是 OpenGL ES 来学习 OpenGL 和 GLSL 会有用吗?

4

2 回答 2

10

桌面环境中的 GLSL 和 OpenGL ES 2.0 中的 GLSL 之间存在巨大差异。

  • 主要区别在于将精度引入整数和浮点类型。需要实现在顶点着色器中为您提供三种不同的精度级别(低/中/高)和片段着色器中的两种(低/中)。实现可以选择支持片段着色器中的高精度,这可以在编译时通过测试预处理器定义是否GL_FRAGMENT_PRECISION_HIGH存在来确定。

  • 第一个发布的桌面 GLSL 规范在哪里。对应于#version 110(如果不存在,则 GLSL 编译器应该假设这是为着色器编写的版本#version) GLSL ES 开头,#version 100并且在许多方面,语法大致相当于#version 120桌面上的 GLSL。您必须对顶点着色器输入/输出和片段着色器输入使用旧的attribute和变量声明,而不是桌面 GLSL (>= 130) 所定义的。varyinginout

  • 顶点纹理查找是 OpenGL ES 2.0 中的一个可选功能,您需要特别注意 的值GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS(如果您的实现不支持它们,它将为 0)。

  • 与桌面 GLSL 相比,GLSL ES 中所需的制服和顶点属性的数量极为有限。GLSL ES 只需要 8 个顶点属性和 128vec4个制服,而桌面 GLSL 分别需要 16 个和 256 个。

  • GLSL ES (100) 只需要 2 个绘制缓冲区(片段着色器输出),而桌面 GLSL 需要 8 个。

  • 在 GLSL ES 中,关于可以和不能用于索引数组的规则更加严格。最低实现要求是,您可能无法使用循环计数器作为 GLSL ES 中片段着色器中统一数组的索引。

gl_FrontColor最后,虽然桌面 GLSL 着色器可能以兼容性配置文件上下文为目标,因此支持类似gl_ModelViewMatrixOpenGL ES 2.0 消除了 OpenGL 认为在 OpenGL 3.2 中不推荐使用的所有功能(加上更多的东西,如多边形填充模式)。因此,任何为重用固定功能顶点指针、矩阵等而编写的着色器都不能直接移植到 OpenGL ES 2.0。

还有很多不同之处,但这应该可以帮助您入门。如果您真的想要更详尽的列表,您可能应该查阅GLSL 150 + (OpenGL 3.2) 和GLSL ES 100 (OpenGL ES 2.0) 的正式规范。两种语言规范(名为Built-in Constants )的末尾都有一个小节概述了实现的最低要求,熟悉这些是个好主意。如果您使用为桌面 GLSL 编写的着色器并尝试移植它,您通常会遇到 GLES 中的硬件/实现限制。

于 2013-11-05T23:48:35.253 回答
2

OpenGL 和 OpenGL ES 的区别

OpenGL ES 1.1 和 OpenGL ES 2.0 是完整 OpenGL 标准的子集。使用 OpenGL ES API 时,在开发应用程序时必须注意一些限制。

例如,以下 OpenGL 功能在 OpenGL ES 1.1 或 OpenGL ES 2.0 中均不存在:

  1. 不支持 glBegin 或 glEnd。请改用顶点数组和顶点缓冲区对象。
  2. 唯一支持的光栅化基元是点、线和三角形。不支持四边形。
  3. 没有多项式函数评估阶段。
  4. 您不能将片段块直接发送到单个片段操作。
  5. 不支持显示列表。

此外,OpenGL ES 2.0 中不存在以下 OpenGL 功能:

  1. 不支持固定功能的图形管线。您必须使用自己的顶点和片段着色器程序。
  2. 不支持查看 glFrustumf 等转换。您必须计算自己的变换矩阵,将其作为统一变量传递给顶点着色器,并在着色器中执行矩阵乘法。
  3. 不支持 glVertexPointer 和 glNormalPointer 等专用函数。请改用 glVertexAttribPointer。
于 2013-11-05T06:40:13.980 回答