I learn WebGL. Next shaders work fine:
// vertex.shader
// precision mediump float;
attribute vec4 a_Position;
attribute float a_PointSize;
void main(){
gl_Position = a_Position;
gl_PointSize = a_PointSize;
}
and
// fragment.shader
precision mediump float;
uniform vec4 u_FragColor;
void main(){
gl_FragColor = u_FragColor;
}
Why it is necessary to set precission for the fragment shader? Vertex shader works without this, but fragment shader doesn't work without this code row (as I see). Why the different behaviour exist?
I read this before, but it didn't help me.
No default precision exists for fp types in fragment shaders in OpenGL ES 2.0.
In vertex shaders, if you do not explicitly set the default precision for floating-point types, it defaults to
highp
. However, if the fragment shader were to default tohighp
as well, that would cause issues since OpenGL ES 2.0 does not require support for high precision floating-point types in the fragment shader stage.The simple answer is that the spec does not define a default float precision for fragment shaders, so you have to specify it yourself.
I always thought it was kind of odd that there was no default. Everything else has a default precision. The default could not be
highp
, since that's not guaranteed to be available in fragment shaders. But I don't see a good reason why it couldn't bemediump
by default.mediump
is the default forint
, and it could just as well be forfloat
.The explanation becomes fairly clear in section 10 ("Issues") of the spec. This section contains various questions that were open while the spec was discussed, and were then answered. There is often some explanation with reasoning why the answer was chosen.
Particularly, "10.3 Precision Qualifiers" deals with this. One of the questions and answers (page 85) is:
I think the key part in this is: "There is no agreement". It sounds like they wanted to define a default precision, but different vendors could not agree on what it should be, and they were so deadlocked that they ended up not defining one at all.