今天才知道Unity自己就有个很方便的Gradient Editor, 于是我们不用频繁切换Photoshop就能很方便快捷的制作一张自定义一维Color LUT。
原理也很简单,使用
Gradient.Evaluate
直接对Gradient Class的公共实例采样就行(Wrap Mode要设置成Clamp),然后用OnInspectorGUI
增加一个按钮用于调用生成文件的方法。
using UnityEngine;
using System.Collections;
using System.IO;
public class GradientTexture : MonoBehaviour
{
public Gradient gradient = new Gradient();
public int resolution = 256;
public string fileName;
private Texture2D texture;
public Texture2D Generate(bool makeNoLongerReadable = false)
{
Texture2D tex = new Texture2D(resolution, 1, TextureFormat.ARGB32, false, true);
tex.filterMode = FilterMode.Bilinear;
tex.wrapMode = TextureWrapMode.Clamp;
tex.anisoLevel = 1;
Color[] colors = new Color[resolution];
float div = (float)resolution;
for (int i = 0; i < resolution; ++i)
{
float t = (float)i/div;
colors[i] = gradient.Evaluate(t);
}
tex.SetPixels(colors);
tex.Apply(false, makeNoLongerReadable);
return tex;
}
public void GenerateFile()
{
byte[] bytes = texture.EncodeToPNG();
File.WriteAllBytes(Application.dataPath + "/Textures/" + fileName + ".png", bytes);
}
public void Refresh()
{
if (texture != null)
{
DestroyImmediate(texture);
}
texture = Generate();
}
void OnDestroy()
{
if (texture != null)
{
DestroyImmediate(texture);
}
}
}
这里是直接生成为一个PNG文件用于材质,当然也可以在脚本中直接SetTexture完成。另外我们还能够在Update里实时地去生成我们想要的梯度,给制作不同的效果带来一种新的思路。