OpenGL ES 2.0与OpenGL 3的异同
OpenGL ES 2.0 vs OpenGL 3 - Similarities and Differences
从我所读到的内容来看,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。
最大的区别是ES中没有遗留的固定功能管道。什么是固定功能管道?与GLSL中的glVertex
、glColor
、glNormal
、glLight
、glPushMatrix
、glPopMatrix
、glMatrixMode
等有关的任何内容,使用访问固定函数数据(如gl_Vertex
、gl_Normal
、gl_Color
、gl_MultiTexCoord
、gl_FogCoord
、gl_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。
- OpenGL ES 2.0将纹理绘制到屏幕上是行不通的
- SDL + OpenGL ES 2.0 使用着色器显示纹理
- 为什么OpenGL ES 3.1+上GL_DEPTH_COMPONENT的glCheckFramebufferStatu
- OpenGL ES 绘制形状
- 如何使用着色器在 opengl es 中渲染四边形内部的部分纹理
- OpenGL ES:在顶点着色器中计算顶点位置时性能不佳
- OpenGL (ES) 图像处理C++
- E/libEGL:调用没有当前上下文的 OpenGL ES API (每个线程记录一次) - Android/SDL
- 使用GlblitFrameBuffer进行多样采样,无法使用OpenGL ES 3.0
- 在使用PI上的OpenGL ES绘制之前,如何旋转纹理
- 使用Emscripten将OpenGL ES转换回主机
- OpenGL ES ANDROID C++ ERROR
- OpenGL ES glTexImage2D optimization
- 在 OpenGL ES for Android 中运行时创建大型纹理的最有效方法
- 使用GlreadPixels()opengl es读取浮动值
- 如何将这些OpenGL着色器转换为Android NDK的GLES3的OpenGL ES着色器
- glDrawBuffers in opengl es 2.0 c++
- 如何在OpenGL ES 1.X中实现Glpushattrib(GL_Current_bit)
- android最佳OpenGL ES语法
- 在 OpenGL ES 示例中找不到"esUtil.h"