| #version 330 |
|
|
| layout (location = 0) in vec3 a_Position; |
| layout (location = 1) in vec3 a_Normal; |
| layout (location = 2) in vec2 a_TextureCoord; |
| layout (location = 3) in vec3 a_Tangent; |
| layout (location = 4) in vec3 a_Bitangent; |
| layout (location = 5) in vec3 a_PRT1; |
| layout (location = 6) in vec3 a_PRT2; |
| layout (location = 7) in vec3 a_PRT3; |
|
|
| out VertexData { |
| vec3 Position; |
| vec3 ModelNormal; |
| vec3 CameraNormal; |
| vec2 Texcoord; |
| vec3 Tangent; |
| vec3 Bitangent; |
| vec3 PRT1; |
| vec3 PRT2; |
| vec3 PRT3; |
| } VertexOut; |
|
|
| uniform mat3 RotMat; |
| uniform mat4 NormMat; |
| uniform mat4 ModelMat; |
| uniform mat4 PerspMat; |
|
|
| #define pi 3.1415926535897932384626433832795 |
|
|
| float s_c3 = 0.94617469575; // (3*sqrt(5))/(4*sqrt(pi)) |
| float s_c4 = -0.31539156525;// (-sqrt(5))/(4*sqrt(pi)) |
| float s_c5 = 0.54627421529; // (sqrt(15))/(4*sqrt(pi)) |
|
|
| float s_c_scale = 1.0/0.91529123286551084; |
| float s_c_scale_inv = 0.91529123286551084; |
|
|
| float s_rc2 = 1.5853309190550713*s_c_scale; |
| float s_c4_div_c3 = s_c4/s_c3; |
| float s_c4_div_c3_x2 = (s_c4/s_c3)*2.0; |
|
|
| float s_scale_dst2 = s_c3 * s_c_scale_inv; |
| float s_scale_dst4 = s_c5 * s_c_scale_inv; |
|
|
| void OptRotateBand0(float x, mat3 R, out float dst) |
| { |
| dst = x; |
| } |
|
|
| // 9 multiplies |
| void OptRotateBand1(float x, mat3 R, out float dst) |
| { |
| // derived from SlowRotateBand1 |
| dst = ( R)*x + (-R)*x + ( R)*x; |
| dst = (-R)*x + ( R)*x + (-R)*x; |
| dst = ( R)*x + (-R)*x + ( R)*x; |
| } |
|
|
| // 48 multiplies |
| void OptRotateBand2(float x, mat3 R, out float dst) |
| { |
| // Sparse matrix multiply |
| float sh0 = x + x + x - x; |
| float sh1 = x + s_rc2*x + x + x; |
| float sh2 = x; |
| float sh3 = -x; |
| float sh4 = -x; |
| |
| // Rotations. R0 and R1 just use the raw matrix columns |
| float r2x = R + R; |
| float r2y = R + R; |
| float r2z = R + R; |
| |
| float r3x = R + R; |
| float r3y = R + R; |
| float r3z = R + R; |
| |
| float r4x = R + R; |
| float r4y = R + R; |
| float r4z = R + R; |
| |
| // dense matrix multiplication one column at a time |
| |
| // column 0 |
| float sh0_x = sh0 * R; |
| float sh0_y = sh0 * R; |
| float d0 = sh0_x * R; |
| float d1 = sh0_y * R; |
| float d2 = sh0 * (R * R + s_c4_div_c3); |
| float d3 = sh0_x * R; |
| float d4 = sh0_x * R - sh0_y * R; |
| |
| // column 1 |
| float sh1_x = sh1 * R; |
| float sh1_y = sh1 * R; |
| d0 += sh1_x * R; |
| d1 += sh1_y * R; |
| d2 += sh1 * (R * R + s_c4_div_c3); |
| d3 += sh1_x * R; |
| d4 += sh1_x * R - sh1_y * R; |
| |
| // column 2 |
| float sh2_x = sh2 * r2x; |
| float sh2_y = sh2 * r2y; |
| d0 += sh2_x * r2y; |
| d1 += sh2_y * r2z; |
| d2 += sh2 * (r2z * r2z + s_c4_div_c3_x2); |
| d3 += sh2_x * r2z; |
| d4 += sh2_x * r2x - sh2_y * r2y; |
| |
| // column 3 |
| float sh3_x = sh3 * r3x; |
| float sh3_y = sh3 * r3y; |
| d0 += sh3_x * r3y; |
| d1 += sh3_y * r3z; |
| d2 += sh3 * (r3z * r3z + s_c4_div_c3_x2); |
| d3 += sh3_x * r3z; |
| d4 += sh3_x * r3x - sh3_y * r3y; |
| |
| // column 4 |
| float sh4_x = sh4 * r4x; |
| float sh4_y = sh4 * r4y; |
| d0 += sh4_x * r4y; |
| d1 += sh4_y * r4z; |
| d2 += sh4 * (r4z * r4z + s_c4_div_c3_x2); |
| d3 += sh4_x * r4z; |
| d4 += sh4_x * r4x - sh4_y * r4y; |
| |
| // extra multipliers |
| dst = d0; |
| dst = -d1; |
| dst = d2 * s_scale_dst2; |
| dst = -d3; |
| dst = d4 * s_scale_dst4; |
| } |
|
|
| void main() |
| { |
| // normalization |
| mat3 R = mat3(ModelMat) * RotMat; |
| VertexOut.ModelNormal = a_Normal; |
| VertexOut.CameraNormal = (R * a_Normal); |
| VertexOut.Position = a_Position; |
| VertexOut.Texcoord = a_TextureCoord; |
| VertexOut.Tangent = (R * a_Tangent); |
| VertexOut.Bitangent = (R * a_Bitangent); |
| float PRT0, PRT1, PRT2; |
| PRT0 = a_PRT1; |
| PRT1 = a_PRT1; |
| PRT1 = a_PRT1; |
| PRT1 = a_PRT2; |
| PRT2 = a_PRT2; |
| PRT2 = a_PRT2; |
| PRT2 = a_PRT3; |
| PRT2 = a_PRT3; |
| PRT2 = a_PRT3; |
|
|
| OptRotateBand1(PRT1, R, PRT1); |
| OptRotateBand2(PRT2, R, PRT2); |
|
|
| VertexOut.PRT1 = vec3(PRT0,PRT1,PRT1); |
| VertexOut.PRT2 = vec3(PRT1,PRT2,PRT2); |
| VertexOut.PRT3 = vec3(PRT2,PRT2,PRT2); |
|
|
| gl_Position = vec4(a_TextureCoord, 0.0, 1.0) - vec4(0.5, 0.5, 0, 0); |
| gl_Position *= 2.0; |
| gl_Position *= 2.0; |
| } |
|
|