| | |
| | | #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; |
| | | } |
| | | #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;
|
| | | }
|