Vectorscope.compute 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. #pragma warning(disable : 3568)
  2. #pragma exclude_renderers gles gles3 d3d11_9x
  3. #include "../StdLib.hlsl"
  4. #include "../Colors.hlsl"
  5. RWStructuredBuffer<uint> _VectorscopeBuffer;
  6. Texture2D<float4> _Source;
  7. CBUFFER_START (Params)
  8. float4 _Params; // x: source width, y: source height, z: buffer size, w: linear?
  9. CBUFFER_END
  10. #define GROUP_SIZE_X 16
  11. #define GROUP_SIZE_Y 16
  12. #ifdef DISABLE_COMPUTE_SHADERS
  13. TRIVIAL_COMPUTE_KERNEL(KVectorscopeGather)
  14. TRIVIAL_COMPUTE_KERNEL(KVectorscopeClear)
  15. #else
  16. #pragma kernel KVectorscopeGather
  17. [numthreads(GROUP_SIZE_X, GROUP_SIZE_Y, 1)]
  18. void KVectorscopeGather(uint2 dispatchThreadId : SV_DispatchThreadID)
  19. {
  20. if (dispatchThreadId.x < uint(_Params.x) && dispatchThreadId.y < uint(_Params.y))
  21. {
  22. float3 color = saturate(_Source[dispatchThreadId].xyz);
  23. if (_Params.w > 0)
  24. color = LinearToSRGB(color);
  25. float3 yuv = RgbToYCbCr(color);
  26. yuv.yz += (0.5).xx;
  27. uint u = (uint)floor(yuv.y * _Params.z);
  28. uint v = (uint)floor(yuv.z * _Params.z);
  29. InterlockedAdd(_VectorscopeBuffer[v * _Params.z + u], 1u);
  30. }
  31. }
  32. #pragma kernel KVectorscopeClear
  33. [numthreads(GROUP_SIZE_X, GROUP_SIZE_Y, 1)]
  34. void KVectorscopeClear(uint2 dispatchThreadId : SV_DispatchThreadID)
  35. {
  36. if (dispatchThreadId.x < uint(_Params.z) && dispatchThreadId.y < uint(_Params.z))
  37. _VectorscopeBuffer[dispatchThreadId.y * _Params.z + dispatchThreadId.x] = 0u;
  38. }
  39. #endif