7
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【Unity】Gradientからカラーランプテクスチャを生成する

Posted at

UnityでGradientクラスのインスタンスからカラーランプテクスチャをランタイムで生成して、シェーダーで利用するまでの方法です。

Gradientのグラデーションをインスペクターから設定し、CreateTextureでGradientからテクスチャを生成しています。
テクスチャはx方向にグラデーションになるようにしています。

GradientTextureTest
using UnityEngine;

[ExecuteInEditMode]
public class GradientTextureTest : MonoBehaviour {

    [SerializeField] private Gradient gradient;

    private void Awake()
    {
        Material material = new Material(Shader.Find("Custom/Gradient"));
        material.SetTexture("_GradientTex", CreateTexture());
        GetComponent<Renderer>().material = material;
    }

    private Texture2D CreateTexture()
    {
        Texture2D texture = new Texture2D(128, 1);
        for (int h = 0; h < texture.height; h++)
        {
            for (int w = 0; w < texture.width; w++)
            {
                texture.SetPixel(w, h, gradient.Evaluate((float)w / texture.width));
            }
        }

        texture.Apply();
        texture.wrapMode = TextureWrapMode.Clamp;
        return texture;
    }
}

使用したシェーダーです。法線と_Dirで指定した方向の角度に応じてテクスチャをサンプリングしています。

Shader "Custom/Gradient"
{
	Properties
	{
		_GradientTex ("Gradient Texture", 2D) = "white" {}
		_Dir ("Direction", Vector) = (0, 1, 0)
	}
	SubShader
	{
		Pass
		{
			CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag
			#include "UnityCG.cginc"

			struct appdata
			{
				float4 vertex : POSITION;
				float3 normal : NORMAL; 
			};

			struct v2f
			{
				float4 vertex : SV_POSITION;
				float3 normal : TEXCOORD0;
			};

			sampler2D _GradientTex;
			float3 _Dir;

			v2f vert (appdata v)
			{
				v2f o;
				o.vertex = UnityObjectToClipPos(v.vertex);
				o.normal = UnityObjectToWorldNormal(v.normal);
				return o;
			}
			
			fixed4 frag (v2f i) : SV_Target
			{
				float3 normal = normalize(i.normal);
				float3 dir = normalize(_Dir);
				float3 col = tex2D(_GradientTex, float2(dot(normal, dir) * 0.5+ 0.5, 0));
				return fixed4(col, 1.0);
			}
			ENDCG
		}
	}
}

Sphereメッシュに使用するとこんな感じになります。

output.gif

7
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?