OpenGL ES 2.0与OpenGL 3的异同

OpenGL ES 2.0 vs OpenGL 3 - Similarities and Differences

本文关键字:OpenGL ES      更新时间:2023-10-16

从我所读到的内容来看,OpenGL ES 2.0似乎不像OpenGL 2.1那样,这是我以前的假设。

我想知道的是OpenGL 3是否可以与OpenGL ES 2.0相媲美。换言之,考虑到我即将为桌面和安卓制作一个游戏引擎,我是否应该特别注意OpenGL 3.x+和OpenGL ES 2.0之间的差异?

这也可以包括OpenGL 4.x版本。

例如,如果我开始读这本书,如果我计划将引擎移植到Android(当然使用NDK;)),我是在浪费时间吗?

从我读到的内容来看,OpenGL ES 2.0似乎与OpenGL 2.1完全不同,这是我以前的假设。

定义"不一样"。Desktop GL 2.1有一系列ES 2.0没有的功能。但是,这两者中有一个最常见的子集可以同时使用(尽管在纹理图像加载方面,您必须对其进行篡改,因为存在一些显著的差异)。

Desktop GL 3.x提供了许多未经扩展的ES 2.0所没有的功能。Framebuffer对象是3.x中的核心,而它们是2.0中的扩展(即使这样,你也只能得到一个目标图像,而没有另一个扩展)。有变换反馈、整数纹理、统一缓冲区对象和几何体着色器。这些都是ES 2.0中没有的特定硬件功能,或者只能通过扩展提供。其中一些可能是特定于平台的。

但桌面GL 3.x上也提供了一些很好的API便利功能。显式属性位置(layout(location=#))、VAO等

例如,如果我开始读这本书,如果我计划将引擎移植到Android(当然使用NDK;)),我是在浪费时间吗?

这取决于你打算做多少工作,以及你准备做什么来让它发挥作用。至少,你应该了解OpenGL ES 2.0的功能,这样你就可以知道它与桌面GL的区别

很容易避免实际的硬件功能。渲染到纹理(或渲染到多个纹理)是算法所要求的。变换反馈、几何体着色器等也是如此。因此,你需要多少取决于你试图做什么,根据算法可能有其他选择。

你更容易被吸引的是桌面GL 3.x的便利功能。例如:

layout(location = 0) in vec4 position;

这在ES 2.0中是不可能的。类似的定义是:

attribute vec4 position;

这将在ES 2.0中起作用,但它将而不是导致position属性与属性索引0相关联。这必须通过代码来完成,在链接程序之前使用glBindAttribLocation。Desktop GL也允许这样做,但你链接到的书没有这样做。原因很明显(这是一本基于3.3的书,而不是一本试图与旧GL版本保持兼容性的书)。

统一缓冲区是另一种。这本书让自由地使用它们,特别是对于共享的透视矩阵。这是一种简单有效的方法。但ES 2.0没有这个功能;它只有每个项目的制服。

同样,如果您愿意,您可以对公共子集进行编码。也就是说,您可以故意放弃使用显式属性位置、统一缓冲区、顶点数组对象等。但那本书也不能完全帮助你做到这一点。

这会浪费你的时间吗?好吧,这本书不是为了教你OpenGL 3.3 API(它确实做到了,但这不是重点)。这本书教你图形编程;恰好使用3.3 API。您在那里学习的技能(基于硬件的技能除外)将转移到您使用的任何涉及着色器的API或系统。

这样说吧:如果你不太了解图形编程,那么你用什么API学习就无关紧要了。一旦你掌握了这些概念,你就可以阅读各种文档,并理解如何将这些概念应用于任何新的API。

OpenGL ES 2.0(和3.0)主要是Desktop OpenGL的一个子集。

最大的区别是ES中没有遗留的固定功能管道。什么是固定功能管道?与GLSL中的glVertexglColorglNormalglLightglPushMatrixglPopMatrixglMatrixMode等有关的任何内容,使用访问固定函数数据(如gl_Vertexgl_Normalgl_Colorgl_MultiTexCoordgl_FogCoordgl_ModelViewMatrix)的任何变量以及来自固定函数流水线的各种其他矩阵。

如果你使用这些功能中的任何一个,你都会有一些工作要做。OpenGL ES 2.0和3.0只是普通着色器。没有为您提供"3d"。你需要自己写所有的投影,照明,纹理参考,等等。

如果你已经在做了(大多数现代游戏可能都在做),你可能没有太多的工作。另一方面,如果你一直在使用那些过时的OpenGL功能,根据我的经验,这些功能仍然非常常见(大多数教程仍然使用这些东西)。然后,当你试图自己复制这些功能时,你需要做一些工作。

有一个开源库regal,我认为它是由NVidia创建的。它应该复制那些东西。请注意,整个固定功能系统的效率相当低,这也是它被弃用的原因之一,但这可能是一种快速工作的方法。

其中一些依赖于驱动程序,但其他的在规范中完全不可用,但这些是我从GL3.3到GLES2时遇到的一些问题。

  • 如果您正在使用https://glad.dav1d.de/要生成GL加载程序,您必须将其设置为gles2(例如3.0版本)
  • gladGLLoader更改为gladGLES2Loader
  • 属性位置可能需要使用glGetAttribLocation进行设置
  • glBindAttribLocation可能不工作(特定于驾驶员)
  • glTexImage2D内部格式和外部格式需要相同
  • glEnable(GL_BLEND)可能不工作
  • glEnable(GL_MULTISAMPLE)不起作用
  • 没有CCD_ 24
  • 使用非2次方纹理时的问题,可以通过更改对齐方式(如glPixelStorei ( GL_UNPACK_ALIGNMENT, 1 );)来解决,但这可能无法解决,有些移动设备无法处理非2次方纹理
  • glVertexAttribDivisor可能不起作用(取决于版本,我认为3.0支持它)
  • PNG文件在手机上加载需要更长的时间,可能值得将其转换为JPEG

这以及一般问题,如较少的VRAM和GL_MAX_TEXTURE_SIZE。