強火で進め

このブログではプログラム関連の記事を中心に書いてます。

(Cg)シェーダ内で sin の値を使い、時間と共に色を変化させる

昨日の「Diffuse」のコードをベースに色々変更してみる勉強の続き。

以下のページを読んでると sin や cos の値を使える事を発見。早速、試してみました。

Unity - ShaderLab builtin values
http://unity3d.com/support/documentation/Components/SL-BuiltinValues.html

色の部分をsinカーブで白と黒を繰り返す様に以下の様にプログラムを書きました。

Shader "test" {
Properties {
	_Color ("Main Color", Color) = (1,1,1,1)
	_MainTex ("Base (RGB) Trans (A)", 2D) = "white" {}
}

SubShader {
	Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"}
	LOD 200

CGPROGRAM
#pragma surface surf Lambert alpha

sampler2D _MainTex;
fixed4 _Color;

struct Input {
	float2 uv_MainTex;
};

void surf (Input IN, inout SurfaceOutput o) {
	fixed4 c = tex2D(_MainTex, IN.uv_MainTex) * _Color;
	o.Albedo = float4((_SinTime.x+1.0)*.5, (_SinTime.x+1.0)*.5, (_SinTime.x+1.0)*.5, 1.0);
	o.Alpha = c.a;
}
ENDCG
}

Fallback "Transparent/VertexLit"
}

メインの処理はこの部分です。R、G、Bそれぞれの値に _SinTime.x を設定する事で白と黒の間を繰り返します。

	o.Albedo = float4((_SinTime.x+1.0)*.5, (_SinTime.x+1.0)*.5, (_SinTime.x+1.0)*.5, 1.0);

sinの値なので -1〜+1 の範囲を繰り返しているハズなので 0〜1 の範囲に置き換える様に (_SinTime.x+1.0)*.5 と記述しています。

ドキュメントによると _SinTime は以下の様になっているため x → y → z → w の順番で速度が速くなる様です。

float4 _SinTime : Sine of time: (t/8, t/4, t/2, t)

_SinTime.x を _SinTime.z や _SinTime.w など変更してみて違いを確認してみて下さい。

また、R,G,Bそれぞれの値が変化するタイミングが異なる様に記述すると色が時間と共に変化する様なシェーダが作成可能です。

	o.Albedo = float4((_SinTime.x+1.0)*.5, (_SinTime.y+1.0)*.5, (_SinTime.z+1.0)*.5, 1.0);