I am trying to convert a 330 shader to 110 but can't find a work around for:
v_norm = normalize(mat3(modelview) * vNormal);
The error returned is:
GLSL 110 does not allow sub- or super-matrix constructors
The complete shader:
#version 110
attribute vec3 vPosition;
attribute vec3 vNormal;
varying vec3 v_norm;
uniform mat4 modelview;
void main()
{
gl_Position = modelview * vec4(vPosition, 1.0);
v_norm = normalize(mat3(modelview) * vNormal);
v_norm = vNormal;
}
I'll assume that you don't understand what "sub- or super-matrix construction" is, since if you did, the workaround would be obvious.
The statement mat3(modelview) tells GLSL to construct a mat3. But the matrix passed to it is a mat4, a 4x4 matrix. Obviously there are 16 numbers instead of the 9 used by mat3.
Under the rules of decent GLSL versions, this would extract the upper-left 3x3 sub-matrix of the given mat4. GLSL 1.10 is not decent.
So the workaround for this is to do it manually. Construct a mat3 made from 9 values, taken from the upper-left portion of the modelview matrix. Or from three vectors:
mat3(modelview[0].xyz, modelview[1].xyz, modelview[2].xyz)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With