OpenGL ES 2.0 vs OpenGL 3 - Similarities and Differences
Asked Answered
C

3

12

From what I've read, it appears that OpenGL ES 2.0 isn't anything like OpenGL 2.1, which is what I assumed from before.

What I'm curious to know is whether or not OpenGL 3 is comparable to OpenGL ES 2.0. In other words, given that I'm about to make a game engine for both desktop and Android, are there any differences I should be aware of in particular regarding OpenGL 3.x+ and OpenGL ES 2.0?

This can also include OpenGL 4.x versions as well.

For example, if I start reading this book, am I wasting my time if I plan to port the engine to Android (using NDK of course ;) )?

Carbonization answered 9/3, 2012 at 6:33 Comment(0)
U
27

From what I've read, it appears that OpenGL ES 2.0 isn't anything like OpenGL 2.1, which is what I assumed from before.

Define "isn't anything like" it. Desktop GL 2.1 has a bunch of functions that ES 2.0 doesn't have. But there is a mostly common subset of the two that would work on both (though you'll have to fudge things for texture image loading, because there are some significant differences there).

Desktop GL 3.x provides a lot of functionality that unextended ES 2.0 simply does not. Framebuffer objects are core in 3.x, whereas they're extensions in 2.0 (and even then, you only get one destination image without another extension). There's transform feedback, integer textures, uniform buffer objects, and geometry shaders. These are all specific hardware features that either aren't available in ES 2.0, or are only available via extensions. Some of which may be platform-specific.

But there are also some good API convenience features available on desktop GL 3.x. Explicit attribute locations (layout(location=#)), VAOs, etc.

For example, if I start reading this book, am I wasting my time if I plan to port the engine to Android (using NDK of course ;) )?

It rather depends on how much work you intend to do and what you're prepared to do to make it work. At the very least, you should read up on what OpenGL ES 2.0 does, so that you can know how it differs from desktop GL.

It's easy to avoid the actual hardware features. Rendering to texture (or to multiple textures) is something that is called for by your algorithm. As is transform feedback, geometry shaders, etc. So how much you need it depends on what you're trying to do, and there may be alternatives depending on the algorithm.

The thing you're more likely to get caught on are the convenience features of desktop GL 3.x. For example:

layout(location = 0) in vec4 position;

This is not possible in ES 2.0. A similar definition would be:

attribute vec4 position;

That would work in ES 2.0, but it would not cause the position attribute to be associated with the attribute index 0. That has to be done via code, using glBindAttribLocation before the program is linked. Desktop GL also allows this, but the book you linked to doesn't do it. For obvious reasons (it's a 3.3-based book, not one trying to maintain compatibility with older GL versions).

Uniform buffers is another. The book makes liberal use of them, particularly for shared perspective matrices. It's a simple and effective technique for that. But ES 2.0 doesn't have that feature; it only has the per-program uniforms.

Again, you can code to the common subset if you like. That is, you can deliberately forgo using explicit attribute locations, uniform buffers, vertex array objects and the like. But that book isn't exactly going to help you do it either.

Will it be a waste of your time? Well, that book isn't for teaching you the OpenGL 3.3 API (it does do that, but that's not the point). The book teaches you graphics programming; it just so happens to use the 3.3 API. The skills you learn there (except those that are hardware based) transfer to any API or system you're using that involves shaders.

Put it this way: if you don't know graphics programming very much, it doesn't matter what API you use to learn. Once you've mastered the concepts, you can read the various documentation and understand how to apply those concepts to any new API easily enough.

Unmannerly answered 9/3, 2012 at 7:4 Comment(2)
The layout qualifier is actually available in ES 2.0. You need to specify "#extension GL_EXT_separate_shader_objects : enable" in your GLSL and you still use "attribute" rather than "in".Luculent
@NicolBolas that is incorrect. The spec clearly states "also tacks on ARB_explicit_attrib_location functionality"Flieger
T
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.

Talkingto answered 4/3, 2016 at 17:55 Comment(0)
M
0

Some of these are dependent on the driver, but others are purely not available in the spec, but these are some of the things I have issues with when going from GL3.3 to GLES.

  • If you are using https://glad.dav1d.de/ to generate a GL loader, you will have to set it for gles2, (version 3.0, for example).
  • Change gladGLLoader to gladGLES2Loader.
  • Attribute locations may need to be set with glGetAttribLocation.
  • glBindAttribLocation may not work (driver specific)
  • glTexImage2D internal format and external format need to be the same.
  • glEnable(GL_BLEND) may not work.
  • glEnable(GL_MULTISAMPLE) doesn't work.
  • no glPolygonMode.
  • Issues when using non power of 2 textures, this might be fixed by changing the alignment, something like glPixelStorei ( GL_UNPACK_ALIGNMENT, 1 );, but this may not fix it, some mobile devices just won't handle non-power of 2 textures.
  • glVertexAttribDivisor may not work (depending on the version, I think 3.0 supports it).
  • PNG files will take longer to load on mobile, might be worth converting them to JPEG.
  • mipmapping like GL_LINEAR_MIPMAP_LINEAR and glGenerateMipMaps might have issues This as well as general issues, like less VRAM, and GL_MAX_TEXTURE_SIZE.
  • If you set attributes non continuously, ie. glEnableVertexAttribArray(1); glVertexAttribPointer(1 , ...)); glEnableVertexAttribArray(3); glVertexAttribPointer(3 , ...)); this caused a misalignment for me in GLES but not in OpenGL, needs to be glEnableVertexAttribArray(1);...glEnableVertexAttribArray(2);.
Mitch answered 13/7, 2023 at 2:42 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.