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

XZe*_*Zen 4 android opengl-es

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

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

And*_*man 9

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

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

  • 哪里首次发布桌面GLSL规范.对应于#version 110(并且GLSL编译器应该假设这是一个着色器编写的版本,如果没有#version)GLSL ES开始于#version 100并且在许多方面,语法大致相当于#version 120桌面上的GLSL .你必须使用旧的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_ModelViewMatrixOpenGL 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中的硬件/实现限制.