您最多选择25个主题
主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
141 行
4.0 KiB
141 行
4.0 KiB
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
|
|
}
|