#include "UnityCG.cginc" RWStructuredBuffer _Waveform; Texture2D _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); }