OpenGL ES 2.0与OpenGL 3 - 相似之处和不同之处

时间:2012-03-09 06:33:59

标签: android c++ opengl-es desktop-application opengl-es-2.0

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

我很想知道的是OpenGL 3是否与OpenGL ES 2.0相当。换句话说,鉴于我即将为桌面和Android制作游戏引擎,我是否应该特别注意OpenGL 3.x +和OpenGL ES 2.0?

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

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

2 个答案:

答案 0 :(得分:21)

  

从我读过的内容来看,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相关联。必须通过代码完成,使用{{3在程序链接之前。 Desktop GL也允许这样做,但您链接的书不能这样做。出于显而易见的原因(这是一本基于3.3的书,而不是一本试图保持与旧版GL兼容的书)。

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

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

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

这样说:如果你不太了解图形编程,那么用你学习的API并不重要。一旦掌握了这些概念,就可以阅读各种文档,并了解如何将这些概念轻松应用到任何新API中。

答案 1 :(得分:1)

OpenGL ES 2.0 (and 3.0) is mostly a subset of Desktop OpenGL.

The biggest difference is there is no legacy fixed function pipeline in ES. What's the fixed function pipeline? Anything having to do with glVertex, glColor, glNormal, glLight, glPushMatrix, glPopMatrix, glMatrixMode, etc... in GLSL using any of the variables that access the fixed function data like gl_Vertex, gl_Normal, gl_Color, gl_MultiTexCoord, gl_FogCoord, gl_ModelViewMatrix and the various other matrices from the fixed function pipeline.

If you use any of those features you'll have some work cut out for you. OpenGL ES 2.0 and 3.0 are just plain shaders. No "3d" is provided for you. You're required to write all projection, lighting, texture references, etc yourself.

If you're already doing that (which most modern games probably do ) you might not have too much work. If on the other hand you've been using those old deprecated OpenGL features which from my experience is still very very common (most tutorials still use that stuff). Then you've got a bit of work cut out for you as you try to reproduce those features on your own.

There is an open source library, regal, which I think was started by NVidia. It's supposed to reproduce that stuff. Be aware that whole fixed function system was fairly inefficient which is one of the reasons it was deprecated but it might be a way to get things working quickly.