【Unity】リムライトシェーダー


環境

  • Unity 2021.2.11f1
  • Build-in Rendering Pipline

リムライトとは?

rim light image

リムライトは、物体の後ろから来た光が輪郭を強調する光のことです。逆光ライトとも言います。

リムライトの求め方

リムライトの強さを求めるには、ライトの方向(L)・頂点の法線(N)・視線の方向(V)が必要になります。

公式

limpower=((1max(0,LN))×(1max(0,VN)))nlimpower = ((1- max(0,L\cdot N)) × (1- max(0,-V \cdot N)))^n

パラメータ 説明
nn リムライトの強さの補正値
VV 視線ベクトル
LL ライトベクトル
NN 法線ベクトル

1max(0,LN)1- max(0,L\cdot N)
法線とライトベクトルの内積が0以下のときに一番値が大きくなります。
そして視線の反対側は見えないため、物体の輪郭部分が一番明るく見えます。

1max(0,VN)1- max(0,-V \cdot N)
視線ベクトルとライトベクトルが真反対のときに一番大きくなります。
一言で表すと 逆光度 でしょうか。
あえてこの部分を計算しない表現もあるようなので、除外してもいいかもしれません。

ShaderLabでの実装

RimLight.shader

https://gist.github.com/went5/19260aef5934923167bdd47c5d99dc37

リムライトの強さを求める

fixed4 frag(v2f i):SV_Target
{
    float3 normal = normalize(i.normal);
    float3 viewDir = normalize(i.worldPos.xyz - _WorldSpaceCameraPos.xyz);

    float OneMinusNdotV = 1 - max(0, (dot(normal, -viewDir)));
    float OneMinusNdotL = 1 - max(0, dot(_WorldSpaceLightPos0, normal));
    float rimPower = pow(OneMinusNdotV * OneMinusNdotL, _Power);

    return rimPower;
}

ライトベクトルと法線からリムライトの強さを求める

float OneMinusNdotL = 1 - max(0, dot(_WorldSpaceLightPos0, normal));

1max(0,LN)1- max(0,L\cdot N) の計算をプログラムで表したものです。
ライトベクトルと法線の内積を行ったあと、 max 関数で0未満にしないようにしています。

視線ベクトルと法線からリムライトの強さを求める

float OneMinusNdotV = 1 - max(0, (dot(normal, -viewDir)));

1max(0,VN)1- max(0,-V \cdot N) の計算をプログラムで表したものです。
視線ベクトルと法線の内積を行ったあと、 max 関数で0未満にしないようにしています。

先ほども書きましたが、この部分は省いた表現もあります。(輪郭線のように常に光らせる)

以上で、冒頭の画像(右側)を実装することができます。

Table of contents


©️ 2026 went5. blog icon by

icons8