我需要为 Android 编写基于 opengl 的应用程序。
OpenGL SL 和 OpenGL ES 2.0 SL 之间以及 OpenGL 和 OpenGL ES 之间有很大的区别吗?如果我使用一些与通用 OpenGL 相关的书籍而不是 OpenGL ES 来学习 OpenGL 和 GLSL 会有用吗?
桌面环境中的 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) 所定义的。varying
in
out
顶点纹理查找是 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_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) 的正式规范。两种语言规范(名为Built-in Constants )的末尾都有一个小节概述了实现的最低要求,熟悉这些是个好主意。如果您使用为桌面 GLSL 编写的着色器并尝试移植它,您通常会遇到 GLES 中的硬件/实现限制。
OpenGL 和 OpenGL ES 的区别
OpenGL ES 1.1 和 OpenGL ES 2.0 是完整 OpenGL 标准的子集。使用 OpenGL ES API 时,在开发应用程序时必须注意一些限制。
例如,以下 OpenGL 功能在 OpenGL ES 1.1 或 OpenGL ES 2.0 中均不存在:
此外,OpenGL ES 2.0 中不存在以下 OpenGL 功能: