12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849 |
- #include "UnityCG.cginc"
- RWStructuredBuffer<uint> _Vectorscope;
- Texture2D<float4> _Source;
- CBUFFER_START (Params)
- uint _IsLinear;
- float4 _Res;
- CBUFFER_END
- #define GROUP_SIZE 32
- float3 RgbToYUV(float3 c)
- {
- float Y = 0.299 * c.r + 0.587 * c.g + 0.114 * c.b;
- float U = -0.169 * c.r - 0.331 * c.g + 0.500 * c.b;
- float V = 0.500 * c.r - 0.419 * c.g - 0.081 * c.b;
- return float3(Y, U, V);
- }
- #pragma kernel KVectorscope
- [numthreads(GROUP_SIZE,GROUP_SIZE,1)]
- void KVectorscope(uint2 dispatchThreadId : SV_DispatchThreadID)
- {
- if (dispatchThreadId.x < (uint)_Res.x && dispatchThreadId.y < (uint)_Res.y)
- {
- float3 color = saturate(_Source[dispatchThreadId].xyz);
- if (_IsLinear > 0)
- color = LinearToGammaSpace(color);
- float3 yuv = RgbToYUV(color);
- if (length(yuv.yz) > 0.49)
- yuv.yz = normalize(yuv.yz) * 0.49;
- yuv.yz += (0.5).xx;
- uint u = (uint)floor(yuv.y * _Res.x);
- uint v = (uint)floor(yuv.z * _Res.y);
- InterlockedAdd(_Vectorscope[v * _Res.x + u], 1);
- }
- }
- #pragma kernel KVectorscopeClear
- [numthreads(GROUP_SIZE,GROUP_SIZE,1)]
- void KVectorscopeClear(uint2 dispatchThreadId : SV_DispatchThreadID)
- {
- if (dispatchThreadId.x < (uint)_Res.x && dispatchThreadId.y < (uint)_Res.y)
- _Vectorscope[dispatchThreadId.y * _Res.x + dispatchThreadId.x] = 0u;
- }
|