はじめに
Standard Shaderを使っている場合はEmissionに値を入れれば光物が表現できる
しかし、Surface Shaderでない自作のShaderの場合はEmissionを作るのにひと工夫が必要
環境
- Unity 2018.1.0f2
- Post Processing Stack v1
事前準備
Assets->Create->Post Processing ProfileでProfileを作成
Bloomにチェックを入れる
今回は分かりやすくThresholdを0.9にしておく
メインカメラに「Post Processing Behaviour」をAddcomponentし、先ほど作ったProfileを設定する
元となるShaderの作成
Shader "Custom/BaseShader"
{
Properties
{
_MainTex ("Base (RGB)", 2D) = "white" {}
_MainColor("Color", Color) = (1,1,1,1)
}
SubShader
{
Pass
{
CGPROGRAM
#pragma vertex vert_img
#pragma fragment frag
#include "UnityCG.cginc"
uniform sampler2D _MainTex;
float4 _MainColor;
fixed4 frag(v2f_img i) : SV_Target
{
return tex2D(_MainTex, i.uv) * _MainColor;
}
ENDCG
}
}
}
このシェーダーをマテリアルに適用して適当なテクスチャを張ると
白い部分がうっすら光ります
任意の部分を光らせるシェーダー
Shader "Custom/EmissionShader"
{
Properties
{
_MainTex ("Base (RGB)", 2D) = "white" {}
_MainColor("Color", Color) = (1,1,1,1)
_EmissionMap ("Emission Map", 2D) = "black" {} //追加
[HDR] _EmissionColor ("Emission Color", Color) = (0,0,0) //追加
}
SubShader
{
Pass
{
CGPROGRAM
#pragma vertex vert_img
#pragma fragment frag
#include "UnityCG.cginc"
uniform sampler2D _MainTex;
float4 _MainColor;
uniform sampler2D _EmissionMap; //追加
float4 _EmissionColor; //追加
fixed4 frag(v2f_img i) : SV_Target
{
fixed4 albedo = tex2D(_MainTex, i.uv) * _MainColor;
//↓今回のキモ。通常のalbedoにEmission分の色を足している
return albedo + tex2D(_EmissionMap, i.uv) * _EmissionColor;
}
ENDCG
}
}
}
Baseにはベースとなるテクスチャ
Emission Mapには光らせたい部分を白にしたテクスチャをアサイン
あとはEmission Colorを光らせたい値に調整すればOK
Intensityの値を大きくすれば、より輝きます