vshader36.glsl 649 B

1234567891011121314151617181920212223
  1. #version 150
  2. in vec4 vPosition;
  3. in vec4 vColor;
  4. out vec4 color;
  5. uniform vec4 move;
  6. uniform vec4 rquat; // rotation quaternion
  7. // quaternion multiplier
  8. vec4 multq(vec4 a, vec4 b) {
  9. return (vec4(a.x * b.x - dot(a.yzw, b.yzw),
  10. a.x * b.yzw + b.x * a.yzw + cross(b.yzw, a.yzw)));
  11. }
  12. // inverse quaternion
  13. vec4 invq(vec4 a) { return (vec4(a.x, -a.yzw) / dot(a, a)); }
  14. void main() {
  15. vec4 p;
  16. p = vec4(0.0, vPosition.xyz); // input point quaternion
  17. p = multq(rquat, multq(p, invq(rquat))); // rotated point quaternion
  18. gl_Position = vec4(p.yzw, 1.0) + move; // back to homogeneous coordinates
  19. color = vColor;
  20. }