Permalink
Cannot retrieve contributors at this time
Name already in use
A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
DMD3502-Cutscene-JacobTomassi/Cutscene/Assets/LowpolySimpleHouse/PostProcessing/Editor Resources/Monitors/HistogramRender.shader
Go to fileThis commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
141 lines (114 sloc)
4.05 KB
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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<uint4> _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 | |
} |