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

zeb*_*und 12 c++ android desktop-application opengl-es 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版本.

例如,如果我开始读本书,我在浪费我的时间,如果我打算端口发动机的Android(当然使用NDK;))?

Nic*_*las 22

从我读过的内容来看,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;
Run Code Online (Sandbox Code Playgroud)

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

attribute vec4 position;
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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