从我所读到的情况来看,OpenGL es2.0似乎与OpenGL 2.1完全不同,这正是我之前所假设的。
我想知道的是,OpenGL 3是否可与OpenGL ES2.0相媲美。换句话说,考虑到我即将为桌面和安卓开发一个游戏引擎,我应该特别注意到在OpenGL 3.x+和OpenGL es2.0方面有什么不同吗?
这也可以包括OpenGL 4.x版本。
例如,如果我开始阅读这的书,如果我计划将引擎移植到Android (当然是使用NDK ;),我是不是在浪费时间?
发布于 2012-03-09 07:04:29
从我所读到的情况来看,OpenGL es2.0似乎与OpenGL 2.1完全不同,这正是我之前所假设的。
定义“一点都不像”。桌面GL2.1有一些ES 2.0没有的功能。但是,这两者中有一个最常见的子集,可以同时工作(尽管在纹理图像加载方面您必须伪造一些东西,因为这两者之间有一些显著的差异)。
桌面GL3.x提供了许多未经扩展的ES 2.0无法提供的功能。Framebuffer对象是3.x中的核心,而它们是2.0中的扩展(即使如此,您也只能得到一个目标映像,而不是另一个扩展)。有转换反馈,整数纹理,统一缓冲对象,和几何着色。这些都是一些特定的硬件特性,它们要么在ES 2.0中不可用,要么只能通过扩展才能使用。其中有些可能是特定于平台的。
但是在桌面GL3.x上也有一些很好的API方便功能。显式属性位置(layout(location=#))、VAOs等。
例如,如果我开始阅读这本书,如果我计划将引擎移植到Android (当然是使用NDK ;),我是不是在浪费时间?
这取决于你打算做多少工作,以及你准备做什么来使它发挥作用。至少,您应该阅读一下OpenGL ES 2.0所做的事情,这样您就可以知道它与桌面GL有什么不同。
很容易避免实际的硬件特性。绘制到纹理(或多个纹理)是您的算法所要求的。就像变换反馈,几何图形,等等。所以你需要它的多少取决于你想要做什么,而且可能会有不同的选择取决于算法。
更有可能被吸引的是桌面GL3.x的方便特性。例如:
layout(location = 0) in vec4 position;这在ES 2.0中是不可能的。类似的定义是:
attribute vec4 position;这在ES2.0中是可行的,但它不会导致position属性与属性索引0相关联。这必须通过代码完成,在程序链接之前使用glBindAttribLocation。桌面GL也允许这样做,但是你链接到的书不能做到这一点。原因很明显(这是一本基于3.3的书,而不是试图保持与旧版本GL的兼容性)。
制服缓冲器是另一种。这本书充分利用了它们,特别是在共享透视矩阵方面。这是一种简单而有效的技术。但ES 2.0没有这一特性,它只有按程序编写的制服。
同样,如果愿意,可以将代码编码到公共子集。也就是说,您可以故意放弃使用显式属性位置、统一缓冲区、顶点数组对象等。但那本书也帮不了你。
这会浪费你的时间吗?好吧,这本书并不是为了教你OpenGL 3.3API(它确实这么做了,但这不是重点)。这本书教你图形编程;它恰好使用了3.3API。您在那里学到的技能(除了那些基于硬件的技能)转移到您正在使用的任何涉及着色器的API或系统。
这么说吧:如果你不太懂图形编程,那么你用什么API来学习并不重要。一旦您掌握了这些概念,就可以阅读各种文档,并了解如何将这些概念应用到任何新的API中。
发布于 2016-03-04 17:55:46
OpenGL ES 2.0 (和3.0)主要是桌面OpenGL的一个子集。
最大的区别是在ES中没有遗留的固定函数管道。固定功能管道是什么?任何与glVertex,glColor,glNormal,glLight,glPushMatrix,glPopMatrix,glMatrixMode等有关的事情.在GLSL中,使用从固定函数管道访问固定函数数据(如gl_Vertex、gl_Normal、gl_Color、gl_MultiTexCoord、gl_FogCoord、gl_ModelViewMatrix和其他各种矩阵)的任何变量。
如果您使用这些功能中的任何一个,您将需要完成一些工作。OpenGL ES 2.0和3.0只是普通的着色器。没有为您提供"3d“。你需要自己写所有的投影,照明,纹理参考等等。
如果你已经这么做了(大多数现代游戏可能会这么做),你可能没有太多的工作。另一方面,如果您一直在使用那些旧的被废弃的OpenGL特性,根据我的经验,这些特性仍然非常常见(大多数教程仍然使用这些功能)。然后,当您尝试自己复制这些功能时,您需要完成一些工作。
有一个开源库帝王,我认为它是由NVidia启动的。它应该复制那些东西。请注意,整个固定功能系统是相当低效的,这也是它被否决的原因之一,但它可能是一种让事情快速运转的方法。
https://stackoverflow.com/questions/9629897
复制相似问题