自定义色彩梯度LUT生成

2019-02-04  本文已影响0人  techiz

今天才知道Unity自己就有个很方便的Gradient Editor, 于是我们不用频繁切换Photoshop就能很方便快捷的制作一张自定义一维Color LUT。

Inspector界面
自带梯度编辑器
生成的纹理
原理也很简单,使用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里实时地去生成我们想要的梯度,给制作不同的效果带来一种新的思路。

上一篇下一篇

猜你喜欢

热点阅读