我需要为Android编写基于opengl的应用程序。
OpenGL SL和OpenGL ES 2.0 SL之间以及OpenGL和OpenGL ES之间是否存在很大差异?如果我使用一些与普通OpenGL相关的书而不是OpenGL ES学习OpenGL和GLSL会有用吗?
答案 0 :(得分:8)
桌面环境中的GLSL与OpenGL ES 2.0中的GLSL之间存在巨大差异。
主要区别在于对整数和浮点类型引入精度。实现需要在顶点着色器(低/中/高)和两个片段着色器(低/中)中提供三种不同的精度级别。实现可以选择支持片段着色器中的高精度,这可以通过测试GL_FRAGMENT_PRECISION_HIGH
的预处理器定义是否存在来在编译时确定。
首次发布的桌面GLSL规范。对应于#version 110
(如果没有#version
,则GLSL编译器应该假设这是为着色器编写的版本)GLSL ES以#version 100
开头,并且在许多方面语法是大致相当于桌面上的GLSL #version 120
。您必须使用旧的attribute
和varying
变量声明来表示顶点着色器输入/输出和片段着色器输入,而不是in
和out
,如桌面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_FrontColor
和gl_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功能:
此外,OpenGL ES 2.0中不存在以下OpenGL功能: