ColorMatrix.hx 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. package h3d.pass;
  2. class ColorMatrixShader extends h3d.shader.ScreenShader {
  3. static var SRC = {
  4. @param var texture : Sampler2D;
  5. @param var matrix : Mat4;
  6. @const var useAlpha : Bool;
  7. @const var useMask : Bool;
  8. @const var maskInvert : Bool;
  9. @const var hasSecondMatrix : Bool;
  10. @param var matrix2 : Mat4;
  11. @param var mask : Sampler2D;
  12. @param var maskMatA : Vec3;
  13. @param var maskMatB : Vec3;
  14. @param var maskPower : Float;
  15. @param var maskChannel : Vec4;
  16. function apply( color : Vec4, mat : Mat4 ) : Vec4 {
  17. // by default we ignore alpha since it's not accurate
  18. // in a render target because of alpha blending
  19. return useAlpha ? color * mat : vec4(color.rgb, 1.) * mat;
  20. }
  21. function fragment() {
  22. if( useMask ) {
  23. var color = texture.get(input.uv);
  24. var uv = vec3(input.uv, 1);
  25. var k = pow(mask.get( vec2(uv.dot(maskMatA), uv.dot(maskMatB)) ).dot(maskChannel), maskPower);
  26. var color2 = hasSecondMatrix ? apply(color,matrix2) : color;
  27. output.color = maskInvert ? mix(color2, apply(color,matrix), k) : mix(apply(color,matrix), color2, k);
  28. } else
  29. output.color = apply(texture.get(input.uv),matrix);
  30. }
  31. };
  32. }
  33. class ColorMatrix extends ScreenFx<ColorMatrixShader> {
  34. public var matrix(get, set) : h3d.Matrix;
  35. public var maskPower(get, set) : Float;
  36. public function new( ?m : h3d.Matrix ) {
  37. super(new ColorMatrixShader());
  38. if( m != null ) shader.matrix = m else shader.matrix.identity();
  39. shader.maskPower = 1;
  40. shader.maskChannel.set(1, 0, 0, 0); // red channel
  41. }
  42. inline function get_matrix() return shader.matrix;
  43. inline function set_matrix(m) return shader.matrix = m;
  44. inline function get_maskPower() return shader.maskPower;
  45. inline function set_maskPower(p) return shader.maskPower = p;
  46. public function apply( src : h3d.mat.Texture, out : h3d.mat.Texture, ?mask : h3d.mat.Texture, ?maskMatrix : h2d.col.Matrix ) {
  47. engine.pushTarget(out);
  48. shader.texture = src;
  49. shader.useMask = mask != null;
  50. if( mask != null ) {
  51. shader.mask = mask;
  52. if( maskMatrix == null ) {
  53. shader.maskMatA.set(1, 0, 0);
  54. shader.maskMatB.set(0, 1, 0);
  55. } else {
  56. shader.maskMatA.set(maskMatrix.a, maskMatrix.c, maskMatrix.x);
  57. shader.maskMatB.set(maskMatrix.b, maskMatrix.d, maskMatrix.y);
  58. }
  59. }
  60. render();
  61. engine.popTarget();
  62. }
  63. }