Shader "Hidden/Post FX/Monitors/Histogram Render" { SubShader { ZTest Always Cull Off ZWrite Off Fog { Mode off } CGINCLUDE #pragma fragmentoption ARB_precision_hint_fastest #pragma target 5.0 #include "UnityCG.cginc" StructuredBuffer _Histogram; float2 _Size; uint _Channel; float4 _ColorR; float4 _ColorG; float4 _ColorB; float4 _ColorL; float4 FragSingleChannel(v2f_img i) : SV_Target { const float4 COLORS[4] = { _ColorR, _ColorG, _ColorB, _ColorL }; float remapI = i.uv.x * 255.0; uint index = floor(remapI); float delta = frac(remapI); float v1 = _Histogram[index][_Channel]; float v2 = _Histogram[min(index + 1, 255)][_Channel]; float h = v1 * (1.0 - delta) + v2 * delta; uint y = (uint)round(i.uv.y * _Size.y); float4 color = float4(0.1, 0.1, 0.1, 1.0); float fill = step(y, h); color = lerp(color, COLORS[_Channel], fill); return color; } float4 FragRgbMerged(v2f_img i) : SV_Target { const float4 COLORS[3] = { _ColorR, _ColorG, _ColorB }; float4 targetColor = float4(0.1, 0.1, 0.1, 1.0); float4 emptyColor = float4(0.0, 0.0, 0.0, 1.0); float remapI = i.uv.x * 255.0; uint index = floor(remapI); float delta = frac(remapI); for (int j = 0; j < 3; j++) { float v1 = _Histogram[index][j]; float v2 = _Histogram[min(index + 1, 255)][j]; float h = v1 * (1.0 - delta) + v2 * delta; uint y = (uint)round(i.uv.y * _Size.y); float fill = step(y, h); float4 color = lerp(emptyColor, COLORS[j], fill); targetColor += color; } return saturate(targetColor); } float4 FragRgbSplitted(v2f_img i) : SV_Target { const float4 COLORS[3] = {_ColorR, _ColorG, _ColorB}; const float limitB = round(_Size.y / 3.0); const float limitG = limitB * 2; float4 color = float4(0.1, 0.1, 0.1, 1.0); uint channel; float offset; if (i.pos.y < limitB) { channel = 2; offset = 0.0; } else if (i.pos.y < limitG) { channel = 1; offset = limitB; } else { channel = 0; offset = limitG; } float remapI = i.uv.x * 255.0; uint index = floor(remapI); float delta = frac(remapI); float v1 = offset + _Histogram[index][channel] / 3.0; float v2 = offset + _Histogram[min(index + 1, 255)][channel] / 3.0; float h = v1 * (1.0 - delta) + v2 * delta; uint y = (uint)round(i.uv.y * _Size.y); float fill = step(y, h); color = lerp(color, COLORS[channel], fill); return color; } ENDCG // (0) Channel Pass { CGPROGRAM #pragma vertex vert_img #pragma fragment FragSingleChannel ENDCG } // (1) RGB merged Pass { CGPROGRAM #pragma vertex vert_img #pragma fragment FragRgbMerged ENDCG } // (2) RGB splitted Pass { CGPROGRAM #pragma vertex vert_img #pragma fragment FragRgbSplitted ENDCG } } FallBack off }