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

标签 android opengl-es

我需要为 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 着色器输入使用旧的 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 个绘制缓冲区( fragment 着色器输出),而桌面 GLSL 需要 8 个。

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

最后,虽然桌面 GLSL 着色器可能以兼容性配置文件上下文为目标,因此支持诸如 gl_FrontColorgl_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/

相关文章:

android - 在Android中实现类似iOS的滑动条

java.lang.NoClassDefFoundError : io. reactivex.Flowable

Android 自定义 ListView ,setOnItemSelectedListener 不工作

android - OpenGL ES 2.0 中的纹理图集

Android 视频解码器仅在 Lollipop 上不绘制到 gles 表面

c++ - 如何提升cocos2dx中位图纹理渲染的性能

android - 使用 OpenGL 处理 Activity 生命周期的正确方法是什么

Android:带有居中图像和右侧按钮的栏

java - RecyclerView 的高度 'match_parent' 未按预期工作,而固定高度 (1000dp,2000dp) 正在工作

ios - GLKView 快照方法 : null return val, 出错