In OpenGL ES 2.0 / GLSL, where do you need precision specifiers?
Solution 1:
You don't need precision specifiers on constants/literals since those get compile time evaluated to whatever they are being assigned to.
-
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 amediump
. The defaultfloat
/int
precisions also extend to matrices/vectors. highp
is only supported on systems that have theGL_FRAGMENT_PRECISION_HIGH
macro defined to1
; on the rest you'll get a compiler error. (4.5.4 Available Precision Qualifiers
)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): http://www.khronos.org/registry/gles/specs/2.0/GLSL_ES_Specification_1.0.17.pdf