OpenGL SL和OpenGL ES 2.0 SL之间的区别

时间:2013-11-05 06:35:48

标签: android opengl-es

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

OpenGL SL和OpenGL ES 2.0 SL之间以及OpenGL和OpenGL ES之间是否存在很大差异?如果我使用一些与普通OpenGL相关的书而不是OpenGL ES学习OpenGL和GLSL会有用吗?

2 个答案:

答案 0 :(得分:8)

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

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

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

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

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

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

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

最后,桌面GLSL着色器可能会定位兼容性配置文件上下文,从而支持gl_FrontColorgl_ModelViewMatrix等内容.OpenGL ES 2.0消除了OpenGL在OpenGL 3.2中被认为已弃用的所有功能(加上一些)更多的东西,如多边形填充模式)。因此,为重用固定函数顶点指针,矩阵等而编写的任何着色器都无法直接移植到OpenGL ES 2.0。

还有很多不同之处,但这应该可以让你开始。如果你真的想要一个更全面的列表,你应该参考GLSL 150 +(OpenGL 3.2)和GLSL ES 100(OpenGL ES 2.0)的正式规范。两种语言规范(标题为内置常量)的末尾都有一个子部分,概述了实现最低要求,并且熟悉这些要求是个好主意。如果您为桌面GLSL编写着色器并尝试移植它,您将经常遇到GLES中的硬件/实现限制。

答案 1 :(得分:2)

OpenGL和OpenGL ES之间的差异

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

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

  1. 不支持glBegin或glEnd。改为使用顶点数组和顶点缓冲区对象。
  2. 唯一支持的栅格化基元是点,线和三角形。不支持四边形。
  3. 没有多项式函数评估阶段。
  4. 您不能将片段块直接发送到单个片段操作。
  5. 不支持显示列表。
  6. 此外,OpenGL ES 2.0中不存在以下OpenGL功能:

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