You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

141 lines
4.0 KiB

  1. Shader "Hidden/Post FX/Monitors/Histogram Render"
  2. {
  3. SubShader
  4. {
  5. ZTest Always Cull Off ZWrite Off
  6. Fog { Mode off }
  7. CGINCLUDE
  8. #pragma fragmentoption ARB_precision_hint_fastest
  9. #pragma target 5.0
  10. #include "UnityCG.cginc"
  11. StructuredBuffer<uint4> _Histogram;
  12. float2 _Size;
  13. uint _Channel;
  14. float4 _ColorR;
  15. float4 _ColorG;
  16. float4 _ColorB;
  17. float4 _ColorL;
  18. float4 FragSingleChannel(v2f_img i) : SV_Target
  19. {
  20. const float4 COLORS[4] = { _ColorR, _ColorG, _ColorB, _ColorL };
  21. float remapI = i.uv.x * 255.0;
  22. uint index = floor(remapI);
  23. float delta = frac(remapI);
  24. float v1 = _Histogram[index][_Channel];
  25. float v2 = _Histogram[min(index + 1, 255)][_Channel];
  26. float h = v1 * (1.0 - delta) + v2 * delta;
  27. uint y = (uint)round(i.uv.y * _Size.y);
  28. float4 color = float4(0.1, 0.1, 0.1, 1.0);
  29. float fill = step(y, h);
  30. color = lerp(color, COLORS[_Channel], fill);
  31. return color;
  32. }
  33. float4 FragRgbMerged(v2f_img i) : SV_Target
  34. {
  35. const float4 COLORS[3] = { _ColorR, _ColorG, _ColorB };
  36. float4 targetColor = float4(0.1, 0.1, 0.1, 1.0);
  37. float4 emptyColor = float4(0.0, 0.0, 0.0, 1.0);
  38. float remapI = i.uv.x * 255.0;
  39. uint index = floor(remapI);
  40. float delta = frac(remapI);
  41. for (int j = 0; j < 3; j++)
  42. {
  43. float v1 = _Histogram[index][j];
  44. float v2 = _Histogram[min(index + 1, 255)][j];
  45. float h = v1 * (1.0 - delta) + v2 * delta;
  46. uint y = (uint)round(i.uv.y * _Size.y);
  47. float fill = step(y, h);
  48. float4 color = lerp(emptyColor, COLORS[j], fill);
  49. targetColor += color;
  50. }
  51. return saturate(targetColor);
  52. }
  53. float4 FragRgbSplitted(v2f_img i) : SV_Target
  54. {
  55. const float4 COLORS[3] = {_ColorR, _ColorG, _ColorB};
  56. const float limitB = round(_Size.y / 3.0);
  57. const float limitG = limitB * 2;
  58. float4 color = float4(0.1, 0.1, 0.1, 1.0);
  59. uint channel;
  60. float offset;
  61. if (i.pos.y < limitB)
  62. {
  63. channel = 2;
  64. offset = 0.0;
  65. }
  66. else if (i.pos.y < limitG)
  67. {
  68. channel = 1;
  69. offset = limitB;
  70. }
  71. else
  72. {
  73. channel = 0;
  74. offset = limitG;
  75. }
  76. float remapI = i.uv.x * 255.0;
  77. uint index = floor(remapI);
  78. float delta = frac(remapI);
  79. float v1 = offset + _Histogram[index][channel] / 3.0;
  80. float v2 = offset + _Histogram[min(index + 1, 255)][channel] / 3.0;
  81. float h = v1 * (1.0 - delta) + v2 * delta;
  82. uint y = (uint)round(i.uv.y * _Size.y);
  83. float fill = step(y, h);
  84. color = lerp(color, COLORS[channel], fill);
  85. return color;
  86. }
  87. ENDCG
  88. // (0) Channel
  89. Pass
  90. {
  91. CGPROGRAM
  92. #pragma vertex vert_img
  93. #pragma fragment FragSingleChannel
  94. ENDCG
  95. }
  96. // (1) RGB merged
  97. Pass
  98. {
  99. CGPROGRAM
  100. #pragma vertex vert_img
  101. #pragma fragment FragRgbMerged
  102. ENDCG
  103. }
  104. // (2) RGB splitted
  105. Pass
  106. {
  107. CGPROGRAM
  108. #pragma vertex vert_img
  109. #pragma fragment FragRgbSplitted
  110. ENDCG
  111. }
  112. }
  113. FallBack off
  114. }