要点
- 透過シェーダーのアルファ値は0~1の範囲外も指定できる。
- 覆い焼きっぽい不思議な効果が得られる。
実際に見てみる
以下は透過シェーダーのコード。Shader "Custom/Transparent_Test"
{
Properties
{
Transparent_Value("不透明度", Range(-10,10)) = 0.5
}
SubShader
{
Tags { "Queue"="Transparent" "RenderType"="Transparent" }
Blend SrcAlpha OneMinusSrcAlpha
Pass
{
CGPROGRAM
#pragma vertex vert_img
#pragma fragment frag
#include "UnityCG.cginc"
float Transparent_Value;
fixed4 frag () : SV_Target
{
return fixed4(1,1,1,Transparent_Value);
}
ENDCG
}
}
}
このシェーダーで透過を表現できている。実際に見てみよう。
Planeを作り、試すと以下のようである。
白色が透けている。
さて、このコードは透明度をイジることができる。
たとえば不透明度を下げると、白色が薄くなる。
不透明度を上げると、白色が濃くなる。
では、不透明度をどんどん大きくしてみよう。
なんか不思議な光景になった。
これには透過の仕組みが関係している。
透過の仕組み
UnityのTransparentの計算を、具体的に見てみよう。オブジェクトの不透明度が0.6のとき、
色 = オブジェクトの色 × 0.6 + 背景の色 × (1 - 0.6) で計算する。わかりにくければ
色は「オブジェクトの色の60%」と「背景の色の40%」を足した色 で求めていると考えてもよい。
だからオブジェクトの不透明度が10のとき
色 = オブジェクトの色 × 10 + 背景の色 × (-9) と計算される。すなわち
色は「オブジェクトの色の1000%」から「背景色の900%」を引いた色 で求めている。
だから極端な色になって、コントラストがエグいことになる。
応用例
不透明度を-10にすると、こうなる。動的に変化させると、なんかカッコいい。
使い所は、ない。