4[RequireComponent(typeof(
BoxSlider), typeof(RawImage))]
11 private RawImage image;
13 private ComputeShader compute;
15 private RenderTexture renderTexture;
16 private readonly
int textureWidth = 100;
17 private readonly
int textureHeight = 100;
19 private float lastH = -1;
20 private bool listen =
true;
22 [SerializeField]
private bool overrideComputeShader;
23 private bool supportsComputeShaders;
29 slider = GetComponent<BoxSlider>();
30 image = GetComponent<RawImage>();
31 if (Application.isPlaying)
33 supportsComputeShaders = SystemInfo.supportsComputeShaders;
36 supportsComputeShaders =
false;
39 if (overrideComputeShader) supportsComputeShaders =
false;
40 if (supportsComputeShaders)
42 RegenerateSVTexture();
46 private void InitializeCompute()
48 if (renderTexture ==
null)
50 renderTexture =
new RenderTexture(textureWidth, textureHeight, 0, RenderTextureFormat.RGB111110Float);
51 renderTexture.enableRandomWrite =
true;
52 renderTexture.Create();
55 compute = Resources.Load<ComputeShader>(
"Shaders/Compute/GenerateSVTexture");
56 kernelID = compute.FindKernel(
"CSMain");
58 image.texture = renderTexture;
62 private void OnEnable()
64 if (Application.isPlaying &&
picker !=
null)
71 private void OnDisable()
80 private void OnDestroy()
82 if (image.texture !=
null)
83 if (supportsComputeShaders)
84 renderTexture.Release();
86 DestroyImmediate(image.texture);
89 private void SliderChanged(
float saturation,
float value)
100 private void HSVChanged(
float h,
float s,
float v)
102 if (!lastH.Equals(h))
105 RegenerateSVTexture();
121 private void RegenerateSVTexture()
123 if (supportsComputeShaders)
127 compute.SetTexture(kernelID,
"Texture", renderTexture);
128 compute.SetFloats(
"TextureSize", textureWidth, textureHeight);
129 compute.SetFloat(
"Hue", hue);
131 compute.SetBool(
"linearColorSpace", QualitySettings.activeColorSpace == ColorSpace.Linear);
133 var threadGroupsX = Mathf.CeilToInt(textureWidth / 32f);
134 var threadGroupsY = Mathf.CeilToInt(textureHeight / 32f);
135 compute.Dispatch(kernelID, threadGroupsX, threadGroupsY, 1);
141 if (image.texture !=
null)
142 DestroyImmediate(image.texture);
144 var texture =
new Texture2D(textureWidth, textureHeight);
145 texture.hideFlags = HideFlags.DontSave;
147 for (var s = 0; s < textureWidth; s++)
149 var colors =
new Color32[textureHeight];
150 for (var v = 0; v < textureHeight; v++)
151 colors[v] = HSVUtil.ConvertHsvToRgb(h, (
float) s / 100, (
float) v / 100, 1);
152 texture.SetPixels32(s, 0, 1, textureHeight, colors);
157 image.texture = texture;
HSVChangedEvent onHSVChanged
void AssignColor(ColorValues type, float value)
RectTransform rectTransform
BoxSliderEvent onValueChanged