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

2023-12-20

我需要为 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在许多方面,其语法大致相当于 GLSL#version 120在桌面上。你必须使用旧的attribute and varying顶点着色器输入/输出和片段着色器输入的变量声明,而不是in and out由桌面 GLSL 定义 (>= 130)。

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

  • 与桌面 GLSL 相比,GLSL ES 中所需的制服和顶点属性的数量极其有限。 GLSL ES只需要8个顶点属性和128个vec4Uniform 与桌面 GLSL 不同,桌面 GLSL 分别需要 16 和 256。

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

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

最后,虽然桌面 GLSL 着色器可能以兼容性配置文件上下文为目标,因此支持诸如gl_FrontColor and gl_ModelViewMatrixOpenGL ES 2.0 消除了 OpenGL 认为在 OpenGL 3.2 中已弃用的所有功能(加上一些其他功能,例如多边形填充模式)。因此,任何为重用固定功能顶点指针、矩阵等而编写的着色器都无法直接移植到 OpenGL ES 2.0。

还有很多差异,但这应该可以帮助您入门。如果您确实想要更全面的列表,您可能应该查阅正式规范GLSL 150 http://www.opengl.org/registry/doc/GLSLangSpec.1.50.11.pdf+ (OpenGL 3.2) 和GLSL ES 100 http://www.khronos.org/registry/gles/specs/2.0/GLSL_ES_Specification_1.0.17.pdf(OpenGL ES 2.0)。两种语言规范的末尾都有一个小节(标题为内置常量)概述了实施的最低要求,熟悉这些是一个好主意。如果您采用为桌面 GLSL 编写的着色器并尝试移植它,您通常会遇到 GLES 中的硬件/实现限制。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OpenGL SL 和 OpenGL ES 2.0 SL 之间的区别 的相关文章

随机推荐