エミッシブ

Emission別名:発光、自己発光、エミッション

概要

マテリアルが自分で光を放つように見せる値。光の当たり方に関係なく、設定した色と強さで明るく描かれる。ただし、それだけでは周りの物を照らさない。

デモ

デモを読み込んでいます
白い線をドラッグすると、発光なしとありを見比べられます。発光させても、床や壁、手前の箱は暗いままです。「周りも照らす」をオンにすると、発光する物の近くに同じ色の光源を置いた結果になります。

使われる場面

  • 画面、ランプ、看板

    モニターの画面、電球、ネオンサイン、計器の表示など、光源そのものを描く。

  • SF やファンタジーの演出

    光る目、魔法陣、エネルギーの筋のように、暗い場面で目を引く部分に使う。

  • ブルームとの組み合わせ

    発光の強さを 1 より大きくしておくと、ブルームのしきい値を超えて光のにじみが付き、まぶしさが伝わる。

  • 夜景の窓明かり

    建物の窓を発光させて、遠くの夜景を軽い計算で作る。窓ごとに光源を置かずに済む。

判断基準

こういうときこうする
光源そのもの(画面、電球、ネオン)を描きたい発光を設定する。光の当たり方に関係なく、常に明るく見える。
発光した物の光で、周りの床や壁も照らしたい発光だけでは照らされない。近くに同じ色の光源を置くか、照り返しを計算する仕組み(グローバルイルミネーション、ライトマップ)を使う。
光っているのに、まぶしく見えない発光の強さを 1 より大きくして、ブルームを組み合わせる。周りを暗くしておくと、強さを上げすぎなくても光って見える。
発光部分が白く飛んで、何色に光っているか分からない発光の強さを下げる。色は発光の芯ではなく、周りのにじみや照り返しで見せる。
部品の一部だけを光らせたい発光マップ(光らせる部分だけを明るく塗ったテクスチャ)を使う。

こう見えたら

  • 光っているはずの物の周りが暗いまま光と影
  • 画面やランプが光って見えず、ただの色に見える光と影
  • 光るものがまぶしく見えない光と影

指示の例

  • モニターの画面が光って見えない。画面部分のマテリアルに発光を設定して、強さを 2 くらいにして

  • ネオンは光っているのに、壁や床が照らされていない。ネオンの近くに同じピンク色の点光源を置いて、壁に色が落ちるようにして

  • 光る目がまぶしく見えない。発光の強さを 1 より大きくして、ブルームを弱めにかけて

  • 看板の文字の部分だけを光らせたい。発光マップを使って、文字の部分だけを発光させて

詳細

光を受けずに、光を放つ

通常のマテリアルの明るさは、当たった光の量で決まり、光がなければ黒くなる。エミッシブ(発光)は、光の計算の結果に、決まった色と強さの光をそのまま足す設定である。光源の位置や向きに関係なく明るく描かれるので、画面や電球のような光源そのものを表せる。

Lout=Lr+e sL_\text{out} = L_r + e\,s

LrL_r は当たった光を反射した分、ee は発光の色、ss は発光の強さである。

vec3 color = diffuse * lighting + specular;  // 光を受けて返す分
color += emissiveColor * emissiveIntensity;  // 自分で放つ分を足す

発光は周りを照らさない

リアルタイムの描画では、発光は「その物体をどう描くか」だけの設定である。床や壁の明るさは光源から計算するので、発光する物体が近くにあっても照らされない。デモで「周りも照らす」をオンにすると、発光する物の位置に同じ色の点光源を置くので、ようやく床や壁、手前の箱に光が落ちる。

光の経路を追いかけて計算する方式(パストレーシング)のレンダリングでは、発光面そのものが光源として働き、周りを照らす。リアルタイムでも、照り返しを事前に計算して焼き込むライトマップや、グローバルイルミネーションの仕組みを使えば、発光を周りの明るさに反映できる。

まぶしさの出し方と落とし穴

画面が表示できる明るさは 1 が上限なので、発光の強さを上げても、白い紙と同じ明るさまでしか出ない。まぶしさは、発光の強さを 1 より大きくしてブルームのしきい値を超えさせ、周りににじみを付けることで伝える。このとき発光の値は、トーンマッピングの前の HDR の値として扱う。

強さを上げすぎると、トーンマッピングで色の成分の差が縮まり、発光の芯が白に寄って、何色に光っているのか分からなくなる。色を見せたいときは、芯の明るさを上げるより、にじみや周りへの照り返しに色を持たせるほうが伝わりやすい。

関連