In OpenGL ES 2.0 / GLSL, where do you need precision specifiers?

  1. You don’t need precision specifiers on constants/literals since those get compile time evaluated to whatever they are being assigned to.

  2. In vertex shaders, the following precisions are declared by default: ( 4.5.3 Default Precision Qualifiers)

     precision highp float;
     precision highp int;
     precision lowp sampler2D;
     precision lowp samplerCube;
    

And in fragment shaders you get:

    precision mediump int;
    precision lowp sampler2D;
    precision lowp samplerCube;

This means that if you declare a float in a fragment shader, you have to say whether it is a lowp or a mediump. The default float/int precisions also extend to matrices/vectors.

  1. highp is only supported on systems that have the GL_FRAGMENT_PRECISION_HIGH macro defined to 1; on the rest you’ll get a compiler error. (4.5.4 Available Precision Qualifiers)

  2. The rule for precision in an expression is that they get cast automatically to the type of the assignment / parameter they are bound to. So for your dot, it would use the precision of the input types by default and the additional lowp‘s are unnecessary (and syntactically incorrect). If you want to down-cast a type to a lower precision, the only way to do it is to explicitly assign it to a lower precision.

These answers are all from the Khronos GLSL spec, which you can find here (relevant sections are 4.5.2 and 4.5.3): https://www.khronos.org/registry/OpenGL/specs/es/2.0/GLSL_ES_Specification_1.00.pdf

In more recent versions of the spec, those sections are 4.7.3 and 4.7.4. Nothing has changed, except adding a default precision highp atomic_uint; to both lists. See https://www.khronos.org/registry/OpenGL/specs/es/3.2/GLSL_ES_Specification_3.20.pdf

Leave a Comment