mh01's answer covered much of the basics, so I'm going to add a few suppliments.
OpenGL ES
Let's talk about about ES 2.0 vs. desktop GL 2.1 vs. desktop GL 3.3. For the purpose of this discussion, the term "GL X.Y" will refer to the desktop OpenGL version X.Y, while "ES X.Y" will refer to OpenGL ES X.Y.
Structurally, ES 2.0 has more in common with core GL 3.3 than it does with GL 2.1. GL 3.3 and ES 2.0 are both pure-shader based. They're both pure buffer-object based. Etc. GL 2.1 has many performance and coding traps that would make it easy to write a GL 2.1 app that wouldn't easily be portable to ES 2.0.
However, in terms of shading language syntax, GLSL ES 1.00 (mapping to ES 2.0) looks much more like GL 2.1's GLSL than GL 3.3's. The attribute
and varying
keywords don't exist in 3.3 core; it uses in
and out
, which is a lot more consistent and reasonable when you're dealing with more than 2 shader stages (which is why ES 3.0 adopted the GL 3.3 syntax).
It is easy to map the concepts learned in GL 3.3 to ES 2.0. So if you learn GL 3.3 for any of the various tools for doing so, you'll understand how to work in the ES 2.0 world. You'll need to figure out where the subset is, of course (ie: the things that GL 3.3 can do that ES 2.0 can't), but the concepts are the same.
Mapping GLSL's syntax, so that you can copy shaders from one to the other, is a bit harder. But really, all it takes is a few #defines in the right places. Also, GLSL 3.30 has a few ES compatibility features, like highp
and so forth (which do nothing in desktop GLSL).
So you do gain something for ES 2.0 when learning from GL 3.3 instead of GL 2.1.