物理ベースレンダリング(3) 透過

前回の最後で紹介した拡張設定について、今回から掘り下げていきます。まず始めに、ビジュアル面でわかりやすい[透過]に焦点を当てて紹介します。

透過 (Transmission)

半透明表示は、古くから不透明度(または透明度)を指定してアルファブレンディングで行うのが定番でした。glTFでも標準的な仕様内に[Alphaモード]と[不透明度]を指定するアルファブレンディングがありますが、それとは異なる形で新たに”透過”(Transmission)が拡張として定義されました。(伝搬・伝播などと直訳されているケースもあるようですが、透過が一番しっくりくると思います)

透過はセロハンやクリアファイルのような結晶化した薄いプラスチック、ごく薄いガラスなど、屈折がない薄膜を表現するのに適しています。

アルファブレンディングと透過は背景が透けて見える点では似ていますが、粗さを変えながら比較するとその違いが明瞭にわかります。

アルファブレンディングは全体を同じ比率で合成するだけですが、透過には

  • 表面では鏡面反射する
  • 入射角の浅い辺縁部では吸収や反射(フレネル効果)によって明度の変化が顕著になる
  • 媒質内で散乱しながら光が進むことで、透過先の背景をぼかす効果が得られる

などの特徴があります。

不透明度と同様に、[透過係数]でどの程度透過させるかを調整することもできます。透過係数を0にすると透過を設定しないのと等価になります。

基本色に白以外を設定すると、色付きフィルムのような表現が得られます。

透過を使用する際に注意すべきは、[金属感]が設定されていると透過は打ち消されます。これは金属が光を外部へと反射し、内部への光を吸収してしまう性質によります。(だそうです、細かい理屈はわかっておりません…)

もう一つの注意点は、リアルタイムのプレビュー表示では、同じオブジェクトでも異なるオブジェクトでも「透過」する面の後ろにさらに「透過」する面を二重に透過させることはできません。あくまで疑似的な表現なので、手前の面のみが優先されて表示されます。パストレーシングレンダリングでは正確な描写が得られます。

透過の使用例

ガラスが非常に薄い小型の電球を作成してみます。材質の設定が主眼なのでモデリングについては言及しませんが、下絵として電球の画像を配置しながらモデリングすると、難しくないでしょう。

モデリングができたら材質の設定です。すべての材質にはglTFシェーダを割り当てておきます。

まず、ガラス用の材質を設定します。ガラスには[透過]を適用し、また他のパラメータも次の画像のように設定します。

金属感:0、粗さ:0

透過:オン、透過係数:1

光を放出するフィラメントには[自己照明]を設定します。これにより、任意の形状を光源として使用することができます。自己照明欄の右側のカラーボタンを押し、色表示欄をクリックして、オレンジ色に設定します。

 

口金は金属感を高く、粗さを低く設定します。一例として次のように設定します。

  • 金属感:1
  • 粗さ:0.1

適当な環境マップを適用して、一度パストレーシングレンダリングしてみます。

ガラスや口金の質感がうまく再現できていることがわかります。一方、フィラメントの光量が低すぎて、電球が全然明るくなっていません。

光量は[自己照明]の値と、光源用のオブジェクトの面積によって決まりますが、フィラメント用オブジェクトがかなり細いため、そのままでは光量が非常に小さいものとなっています。

色設定時にHSVモードにしたとき、明るさを示す[V]は通常は0~100の範囲で設定しますが、自己照明の値はこの範囲を超えて数値入力することができます。Vの値を10倍ずつ増やしながらレンダリング結果を確認することを繰り返し、1000万まで増やすとだいぶ明るくなったので、最終的に1500万で調節してみました。フィラメントから放出された光がガラス内部で反射しながら、眩しさを感じる明るさになりました。

なお、glbファイルに出力する際は自己照明は範囲外の値を入力しないでください。glTFの規格により値の範囲が制限されており、出力したファイルがビューア側で正常に読み込めない可能性があります。(追記:Ver4.8.3bでKHR_materials_emissive_strength拡張に対応して、自己照明のVが100以上でもそのまま出力できるようになりました)

今回は[透過]と併せて、自己照明を設定してオブジェクトを光源として使用する方法についても紹介しました。次回は[ボリューム]についてです。