我需要为 Android 编写基于 opengl 的应用程序。
OpenGL SL 和 OpenGL ES 2.0 SL 之间以及 OpenGL 和 OpenGL ES 之间有很大的区别吗?如果我使用一些与一般 OpenGL 而不是 OpenGL ES 相关的书籍来学习 OpenGL 和 GLSL 是否有用?
最佳答案
桌面环境中的 GLSL 与 OpenGL ES 2.0 中的 GLSL 之间存在一些巨大差异。
主要区别在于对整数和浮点类型引入了精度。实现需要在顶点着色器(低/中/高)中为您提供三个不同的精度级别,在 fragment 着色器中提供两个精度级别(低/中)。一个实现可以选择性地支持 fragment 着色器中的高精度,这可以在编译时通过测试
GL_FRAGMENT_PRECISION_HIGH
的预处理器定义是否存在来确定。第一个发布的桌面 GLSL 规范。对应于
#version 110
(如果没有#version
,GLSL 编译器应该假定这是为着色器编写的版本)GLSL ES 以开头#version 100
并且在许多方面,语法大致等同于桌面上的 GLSL#version 120
。您必须对顶点着色器输入/输出和 fragment 着色器输入使用旧的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 个绘制缓冲区( fragment 着色器输出),而桌面 GLSL 需要 8 个。
在 GLSL ES 中,关于什么可以和不能用于索引数组的规则更加严格。最低实现要求是您可能无法在 GLSL ES 的 fragment 着色器中使用循环计数器作为统一数组的索引。
最后,虽然桌面 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 中的硬件/实现限制。
关于android - OpenGL SL 和 OpenGL ES 2.0 SL 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19783173/