Skip to content

影設定

概要

ライトの向きに応じて陰影を付けて立体感を出すことができます。ぼかし量が0のアニメ塗り、そこにぼかしを加えたり部分的な影の濃さを変化させた2DCG的な塗り、影の境界に色を乗せたりAO Mapを用いて部分的に影が出やすくしたりすることでより複雑な塗りにも対応できるようになっています。3影まで設定できそれぞれ個別に色を調節可能なため、奥の影の色を薄くすることで反射光的な表現もできます。また、逆光ライトを用いた逆光表現や、リムライトを用いた光の回り込み、マットキャップを用いた光沢表現など他機能と組み合わせることで表現の幅を広げられるようにしています。

パラメーター

名前説明
マスクタイプマスクテクスチャ指定時の挙動です。
  • 強度 - 色が黒いほど影がマスクされて弱くなっていきます。完全に黒く塗った部分は影が出なくなり、白く塗った部分はそのまま出ます。例えば顔だけ影を無効化するようなことができます。
  • 平面化 - 色が黒いほど法線が平面化され立体感を抑えることができます。白く塗った部分はそのままの法線が使用されます。
マスクと強度影の強さです。グレースケールで指定でき、色が黒いほど影がマスクされて弱くなっていきます。完全に黒く塗った部分は影が出なくなり、白く塗った部分はそのまま出ます。例えば顔だけ影を無効化するようなことができます。テクスチャのRチャンネルが使用されます。
LODテクスチャのぼかし量です。MipMapを利用して解像度を下げることで擬似的なぼかしを行います。
ぼかし量マスクマスクを指定すると部分的にぼかし量を変更できます。RGBが影色1・2・3に対応しているためそれぞれ調整可能です。例えばモデルに一部法線の変化が急で影が鋭く出る部分がある場合にその部分だけぼかし量を大きくすることができます。
影色1・2・3影の色です。通常はメインカラーに乗算しますが、テクスチャを指定して色を上書きすることもできます。透明度はそれぞれの影のブレンドの強さとして扱われます。
範囲影になる範囲です。
ぼかし影のぼかし量です。0にするとくっきりとしたアニメ調になり、値を増やしていくとイラスト調に、更に増やすとリアル調になっていきます。RGBチャンネルはそれぞれ影色1・2・3に対応しています。
ノーマルマップ強度影の付き方にノーマルマップを適用する強さです。
影を受け取る他オブジェクトから影を受け取ります。屋根がある空間で違和感が出ることがあり、オフにしたほうが良い場合が多いです。
境界の色影をぼかした際に境界に色を乗せます。サブサーフェススキャタリングのような効果を作り出したり、影の境界付近にふわっと色を乗せるような絵柄の再現に利用できます。
境界の幅境界の色を乗せる範囲を広くします。
コントラストメインカラーを更に乗算することで影の色を鮮やかにできます。このパラメーターと影色と組み合わせることで単色を乗算するよりも複雑な色味を表現できます。
影色への環境光影響度周囲の光が影の色に影響する強さです。環境光が強ければ強いほどそれに合わせて影が明るくなります。影色を黒くした状態でこのパラメーターを1に設定するとStandard Shaderに近い影色が得られます。
AO MapAO(陰影)テクスチャを指定することで影の付きやすさを制御できます。ここで指定したテクスチャの暗い部分ほど影が出やすくなります。RGBチャンネルはそれぞれ影色1・2・3に対応しています。
Min・MaxAO MapをMix~Maxの範囲で再マッピングします。

影色が計算される流れ

影色 = (影色テクスチャがあれば影色テクスチャ、なければメインカラー) * カラーピッカーの影色 * lerp(1.0, メインカラー, コントラスト);
最終的な影色 = lerp(影色, メインカラー, 環境光 * 影色への環境光影響度);
のような式で計算されます。

HLSL
float4 shadowColorTex = tex2D(_ShadowColorTex, uv);                                     // 影色テクスチャ
float3 indirectCol = lerp(mainColor.rgb, shadowColorTex.rgb, shadowColorTex.a);         // メインカラーと影色テクスチャをブレンド
indirectCol *= _ShadowColor.rgb;                                                        // 影色(カラーピッカー)を乗算
indirectCol = lerp(indirectCol, indirectCol * mainColor.rgb, _ShadowMainStrength);      // メインカラーを更に乗算することでコントラストを強調
indirectCol = lerp(indirectCol, mainColor.rgb, environmentLight * _ShadowEnvStrength);  // 環境光をブレンド

影色がブレンドされる流れ

影色2・3の合成結果 = lerp(影色3, 影色2, 3影のライティング);
全影の合成結果 = lerp(影色2・3の合成結果, 影色1, 2影のライティング);
最終結果 = lerp(全影の合成結果, メインカラー, 1影のライティング);
のような計算でブレンドされます。ライティングの項目に各影の透明度を反映することでそれぞれのオンオフを実現しています。また1影のライティングにはマスクと強度のパラメーターも反映されます。

Released under the MIT License.