スタイライズドライティング:セルシェーディングの先へ
段階的な影は誰もが知る第一歩です。本当の個性はリムライトと影の色の選び方に宿ります。
階調化だけでは足りない
トゥーンシェーダーと言えば、まず光の強度を数段階に丸めることを思い浮かべます。しかしそれだけでは安っぽく見え、アニメ調というより低品質に見えてしまいます。
差を生むのは、その段階がどの色に落ちるかです。影を黒ではなく光の補色方向へ寄せると、シーンは一気にアートディレクションされた見た目になります。
リムライトはシルエットを救う
スタイライズドなシーンでは陰影の情報量が少ないため、オブジェクトが背景に溶けがちです。だからリムライトは装飾ではなく機能的な道具なのです。
リムの強さをカメラ距離でスケーリングすれば、遠くの物体が光りすぎることもなくなります。小さな係数が大きな違いを生みます。
コストを計測する
スタイライズドシェーダーは安いという前提は誤りです。多層リム、アウトライン、独自の影計算は PBR より高くつくことがあります。
私はシェーダーの各バリアントを RenderDoc で計測し、GPU コストをドキュメントに書き込みます。アートチームが予算を見られると、判断の質が上がります。
half3 ToonShade(half3 albedo, half3 N, half3 L, half3 lightColor)
{
half ndl = dot(N, L) * 0.5h + 0.5h;
half band = floor(ndl * _Steps) / _Steps;
half rim = pow(1.0h - saturate(dot(N, _ViewDir)), _RimPower);
return albedo * lightColor * band + _RimColor * rim;
}
hlslToonLit.hlsl
一貫性がすべて
シーン内のすべてのマテリアルが同じライティングモデルを共有する必要があります。PBR のオブジェクトが 1 つあるだけで、スタイライズドなシーンの統一感は崩れます。
そのため共通のライティング関数を書き、すべてのシェーダーからそれを呼び出しています。モデルを一度変えれば、シーン全体が一緒に変わります。