導入
Unity では、色補正はシーンやゲーム画面の色を調整するために使用される技術です。その中でもCurves(曲線)とSaturation(彩度)はよく使われる色補正ツールです。カーブを通じて、RGB チャネルに非線形調整を行うことができ、それによって画像のトーンとコントラストに影響を与えます。また、彩度は画像の彩度を調整して、色をより鮮やかにしたり明るくしたりするために使用されます。
方法
曲線
Unity では、RGB チャンネルのカーブを調整するために Curves が使用され、そのパラメーターは次のとおりです。
- 入力範囲: 入力のピクセル範囲を指定します。通常は 0 ~ 1 ですが、他の範囲も可能です。
- 出力範囲: 出力のピクセル範囲を指定します。通常は 0 ~ 1 ですが、他の範囲も可能です。
- 曲線: 曲線上の点を調整することによって、ピクセルのカラー値を変更します。曲線に点を追加または曲線から削除して、さまざまなカラーマップを作成できます。
飽和
Unity では、Saturation は画像の彩度を調整するために使用され、そのパラメーターは次のとおりです。
- 彩度: 彩度の値を設定します。0 は完全なグレースケール (白黒) を意味し、1 は元の彩度を意味し、1 より大きいと彩度が増加し、1 より小さいと彩度が減少します。
例えば
曲線の例
1.コントラストを上げる
using UnityEngine;
public class ColorCorrectionExample : MonoBehaviour
{
public AnimationCurve redCurve;
public AnimationCurve greenCurve;
public AnimationCurve blueCurve;
private Material material;
private void Awake()
{
material = new Material(Shader.Find("Custom/ColorCorrection"));
}
private void OnRenderImage(RenderTexture source, RenderTexture destination)
{
material.SetTexture("_MainTex", source);
material.SetFloatArray("_RedCurve", redCurve.keys.Select(key => key.value).ToArray());
material.SetFloatArray("_GreenCurve", greenCurve.keys.Select(key => key.value).ToArray());
material.SetFloatArray("_BlueCurve", blueCurve.keys.Select(key => key.value).ToArray());
Graphics.Blit(source, destination, material);
}
}
2. 調色効果を作成する
using UnityEngine;
public class ColorCorrectionExample : MonoBehaviour
{
public AnimationCurve redCurve;
public AnimationCurve greenCurve;
public AnimationCurve blueCurve;
private Material material;
private void Awake()
{
material = new Material(Shader.Find("Custom/ColorCorrection"));
}
private void OnRenderImage(RenderTexture source, RenderTexture destination)
{
material.SetTexture("_MainTex", source);
material.SetFloatArray("_RedCurve", redCurve.keys.Select(key => Mathf.Sin(key.value)).ToArray());
material.SetFloatArray("_GreenCurve", greenCurve.keys.Select(key => Mathf.Cos(key.value)).ToArray());
material.SetFloatArray("_BlueCurve", blueCurve.keys.Select(key => Mathf.Tan(key.value)).ToArray());
Graphics.Blit(source, destination, material);
}
}
飽和の例
1.彩度を上げる
using UnityEngine;
public class SaturationExample : MonoBehaviour
{
[Range(0f, 2f)]
public float saturationValue = 1f;
private Material material;
private void Awake()
{
material = new Material(Shader.Find("Custom/Saturation"));
}
private void OnRenderImage(RenderTexture source, RenderTexture destination)
{
material.SetTexture("_MainTex", source);
material.SetFloat("_Saturation", saturationValue);
Graphics.Blit(source, destination, material);
}
}
2. 彩度を下げる
using UnityEngine;
public class SaturationExample : MonoBehaviour
{
[Range(0f, 2f)]
public float saturationValue = 1f;
private Material material;
private void Awake()
{
material = new Material(Shader.Find("Custom/Saturation"));
}
private void OnRenderImage(RenderTexture source, RenderTexture destination)
{
material.SetTexture("_MainTex", source);
material.SetFloat("_Saturation", 1f / saturationValue);
Graphics.Blit(source, destination, material);
}
}
上記のコードは、色補正操作にカスタム シェーダー (Custom/ColorCorrection および Custom/Saturation) を使用します。ここでは、カーブと彩度を使用して色を調整する方法を示す簡単な例を示しているだけですが、実際には、カーブとパラメータを調整することで、より複雑な色の効果を実現できます。