ColorGrading.hx 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. package hrt.prefab.rfx;
  2. import hxd.Pixels;
  3. class ColorGradingTonemap extends hxsl.Shader {
  4. static var SRC = {
  5. @param var size : Int;
  6. @param var intensity : Float;
  7. @param var lut : Sampler2D;
  8. var hdrColor : Vec4;
  9. var pixelColor : Vec4;
  10. function fragment() {
  11. var uv = pixelColor.rgb;
  12. var innerWidth = size - 1.0;
  13. var sliceSize = 1.0 / size;
  14. var slicePixelSize = sliceSize / size;
  15. var sliceInnerSize = slicePixelSize * innerWidth;
  16. var blueSlice0 = min(floor(uv.b * innerWidth), innerWidth);
  17. var blueSlice1 = min(blueSlice0 + 1.0, innerWidth);
  18. var xOffset = slicePixelSize * 0.5 + uv.r * sliceInnerSize;
  19. var yOffset = sliceSize * 0.5 + uv.g * (1.0 - sliceSize);
  20. var s0 = vec2(xOffset + (blueSlice0 * sliceSize), yOffset);
  21. var s1 = vec2(xOffset + (blueSlice1 * sliceSize), yOffset);
  22. var slice0Color = texture(lut, s0).rgb;
  23. var slice1Color = texture(lut, s1).rgb;
  24. var bOffset = mod(uv.b * innerWidth, 1.0);
  25. pixelColor.rgb = mix(pixelColor.rgb, mix(slice0Color, slice1Color, bOffset), intensity);
  26. }
  27. }
  28. }
  29. class ColorGrading extends RendererFX {
  30. var tonemap = new ColorGradingTonemap();
  31. public var customLut : h3d.mat.Texture;
  32. @:s var size : Int = 16;
  33. @:s var texturePath : String;
  34. @:s public var intensity : Float = 1;
  35. public function getLutTexture() {
  36. if( texturePath == null ) return null;
  37. return hxd.res.Loader.currentInstance.load(texturePath).toTexture();
  38. }
  39. override function end( r:h3d.scene.Renderer, step:h3d.impl.RendererFX.Step ) {
  40. if( step == BeforeTonemapping ) {
  41. r.mark("ColorGrading");
  42. tonemap.intensity = intensity;
  43. tonemap.size = size;
  44. tonemap.lut = customLut != null ? customLut : getLutTexture();
  45. if( tonemap.lut != null && intensity > 0 )
  46. r.addShader(tonemap);
  47. }
  48. }
  49. #if editor
  50. override function edit( ctx : hide.prefab.EditContext ) {
  51. var e = new hide.Element('
  52. <div class="group" name="Color Grading">
  53. <dl>
  54. <dt>LUT</dt><dd><input type="texturepath" field="texturePath"/></dd>
  55. <dt>Size</dt><dd><input type="range" min="1" max="256" step="1" field="size"/></dd>
  56. <dt>Intensity</dt><dd><input type="range" min="0" max="1" field="intensity"/></dd>
  57. </dl>
  58. </div>
  59. <div class="group" name="Debug">
  60. <div align="center" >
  61. <input type="button" value="Create default" class="createDefault" />
  62. </div>
  63. </div>
  64. ');
  65. var but = e.find(".createDefault");
  66. but.click(function(_) {
  67. function saveTexture( name : String ) {
  68. var step = hxd.Math.ceil(255/(size - 1));
  69. var p = hxd.Pixels.alloc(size * size, size, RGBA);
  70. for( r in 0 ... size ) {
  71. for( g in 0 ... size ) {
  72. for( b in 0 ... size ) {
  73. p.setPixel(r + b * size, g, 255 << 24 | ((r*step) << 16) | ((g*step) << 8 ) | (b*step));
  74. }
  75. }
  76. }
  77. var path = ctx.ide.getPath(name);
  78. sys.io.File.saveBytes(path, p.toPNG());
  79. p.dispose();
  80. }
  81. ctx.ide.chooseFileSave("defaultLUT.png", saveTexture);
  82. });
  83. ctx.properties.add(e, this);
  84. }
  85. #end
  86. static var _ = Library.register("rfx.colorGrading", ColorGrading);
  87. }