A note on OpenGL ES 2.0 shaders and floating point

Howdy,

Came across something interesting today that might catch out other newbies like myself, and thought I’d post it here:

After playing with LWJGL, OpenGL and GLSL, I’ve got into the habit of slapping an ‘f’ on the end of every floating point number, including in my vert and frag shaders (i.e. 0.8f, 3f etc.). This doesn’t appear to be a problem with normal OpenGL.

However today I started toying with OpenGL ES 2.0 shaders on Android, and couldn’t get my shaders to compile. After pulling my hair out and trying everything, I eventually discovered that it was the f’s on the end of my floats. I also found that floats must be explicitly defined with a decimal point, or once again the shaders won’t compile (i.e. 1 must be written as 1.0).

So there ya have it. I’m sure it’s in a reference or a tutorial somewhere, but I’ve yet to pay attention and notice it.

Cheers,
nerb.

The default version of GLSL (version 110) doesn’t support implicit float casting. You need to specify #version 120 at the top of your shaders for cross-platform code. Annoyingly, some drivers will just allow implicit floats regardless.

The default GLSL ES version (100) also doesn’t support implicit floats. I’m fairly sure the new ES version (300) supports them.

I should actually look into ES shader versions a bit more; I’m currently not using any version identifier in my code. I think I’ll stick with using the lowest common denominator, and make sure I define floats carefully; at least when using ES.

Anyway, cheers davedes. You seem to have a habit of coming up with the goods in OpenGL posts.