mirror of
https://github.com/FriendshipIsEpic/FiE-Game.git
synced 2024-11-25 23:17:58 +01:00
42 lines
1.4 KiB
Text
42 lines
1.4 KiB
Text
#include "UnityCG.cginc"
|
|
|
|
RWStructuredBuffer<uint4> _Waveform;
|
|
Texture2D<float4> _Source;
|
|
|
|
CBUFFER_START (Params)
|
|
uint _IsLinear;
|
|
uint4 _Channels;
|
|
CBUFFER_END
|
|
|
|
#define COLUMNS 384
|
|
|
|
#pragma kernel KWaveform
|
|
[numthreads(1,COLUMNS,1)]
|
|
void KWaveform(uint2 dispatchThreadId : SV_DispatchThreadID)
|
|
{
|
|
// We want a gamma corrected colors
|
|
float3 color = _Source[dispatchThreadId].rgb;
|
|
if (_IsLinear > 0u)
|
|
color = LinearToGammaSpace(color);
|
|
|
|
color = saturate(color);
|
|
|
|
// Convert color & luminance to histogram bins
|
|
const float kColumnsMinusOne = COLUMNS - 1.0;
|
|
uint3 idx_c = (uint3)(round(color * kColumnsMinusOne));
|
|
uint idx_l = (uint)(round(dot(color.rgb, float3(0.2126, 0.7152, 0.0722)) * kColumnsMinusOne));
|
|
|
|
// A lot of atomic operations will be skipped so there's no need to over-think this one.
|
|
uint j = dispatchThreadId.x * COLUMNS;
|
|
if (_Channels.x > 0u && idx_c.x > 0u) InterlockedAdd(_Waveform[j + idx_c.x].x, 1u); // Red
|
|
if (_Channels.y > 0u && idx_c.y > 0u) InterlockedAdd(_Waveform[j + idx_c.y].y, 1u); // Green
|
|
if (_Channels.z > 0u && idx_c.z > 0u) InterlockedAdd(_Waveform[j + idx_c.z].z, 1u); // Blue
|
|
if (_Channels.w > 0u) InterlockedAdd(_Waveform[j + idx_l].w, 1u); // Luminance
|
|
}
|
|
|
|
#pragma kernel KWaveformClear
|
|
[numthreads(1, COLUMNS, 1)]
|
|
void KWaveformClear(uint2 dispatchThreadId : SV_DispatchThreadID)
|
|
{
|
|
_Waveform[dispatchThreadId.x * COLUMNS + dispatchThreadId.y] = uint4(0u, 0u, 0u, 0u);
|
|
}
|