OOrito Itsuki·2026.06.07

「The Minimal Retroreflective Microfacet Model」の解説と自作レンダラーでのレンダリング例

3DCGRenderingGraphics
0

この記事では、まず「The Minimal Retroreflective Microfacet Model」という論文についての簡単な紹介をします。 次に、その論文の実装を自作レンダラーに取り込んでレンダリングをしてみたので その結果についてを示し、個人的な感想を述べます。

00-teaser-image.png

(画像は The Minimal Retroreflective Microfacet Model の論文より引用)

この論文は3DCGのレンダリングにおいて視覚的に妥当な再帰反射を安いコストで簡単に導入する方法と、その反射のエネルギー保存則と相反性の証明、そして実測値との比較までを行った論文です。 この論文で提案しているBRDFのローブはMRMと呼んでいるようです

再帰反射とは

再帰反射とは 広い照射角にわたって、入射光を進行してきた方向へ反射することです。 反射板や道路標識などでよく使われているのを目にすることがあると思います。 夜にヘッドライトで道路標識を照らすと道路標識が明るく浮き上がってくることがあると思います。 反射材の加工がされていない一般的な看板などは道路標識のように明るく浮かび上がってくることは無いので、比較するとその違いがわかるでしょう。

photo01.jpg

(画像は夜にヘッドライトで照らした道路標識。 https://www.ccs-inc.co.jp/guide/column/light_color_part2/vol04.html より引用)

反射材などはこの再帰反射を実現するために工夫をした表面をもっています。有名なのはコーナーキューブを敷き詰めた構造やガラスビーズを敷き詰めた構造です。

(画像は https://ja.wikipedia.org/wiki/コーナーキューブ より引用)

(画像は https://ja.wikipedia.org/wiki/コーナーキューブ より引用)

私が以前に乗っていた自転車の反射板にはコーナーキューブが敷き詰められた構造が利用されていました。

この論文ではこのような再帰反射を示すマテリアルの実装方法を提示しています。

論文の手法の簡単な紹介

ここからは論文の手法を簡単に紹介します。 より詳細な内容が欲しい方は原論文を読んでください。

提案手法

back-vector ([Belcour et al. 2014])として次のようなベクトルを導入します。

やっていることはハーフベクトルを求めるときに使う視線方向を法線ベクトルに対して反転したものを代わりに使っているだけです。そしてこの求めたback-vectorをこのハーフベクトルの代わりに使うことで既存のMicrofacetベースのモデルを再帰反射モデルに変更できるとしています。

論文ではこのあとさらに詳しく、このback-vectorに掛かるヤコビアンの導出と、相反性とエネルギー保存についての証明も行っています。

実測データとの比較

論文のFigure 5を下記に引用します。

01-figure5.png

こちらは[Belcour et al. 2014]の測定データのBRDFに対してMRMをフィットした図です。 黒点が測定BRDF、緑線がMRMです。 光源角度はθL = 15°, 30°, 60°の三つで、横軸はview angle θV、縦軸はBRDF valueです。縦軸は対数スケールです。

この図を見ればわかるように、MRMは「測定データ全体」を完全に説明しているわけではありません。 特に測定BRDFには非常に鋭いピークとより広い角度範囲のベース成分が見えます。 MRM は主にretroreflective peakの側を合わせています。 ほかのベース反射や通常の反射の方向のスペキュラピークは含んでいません。

このMRMはあくまで再帰反射のスペキュラ成分の部分によくフィットするモデルであることを示しています。 他の成分は別途他のBRDFレイヤーしたりして作ることになりそうです。 retroreflectiveな部分のスペキュラのピークについては実用上十分に近い一致をしていることがわかります。

この手法の利用先

この論文の手法は2026年5月22日ごろにリリースされた この記事投稿時点で最新版のMaterialXのバージョン1.39.5で早速採用されています。

MaterialX 1.39.5 release note

自作レンダラーへの実装

自作のRust製CPUレンダラーでこのMRMのモデルをレンダリングします。

この自作のレンダラーにはMaterialXの組み込みが行われており、今回のMaterialX 1.39.5への対応の過程でMRMの実装を行いました。 既存のgeneralized_schlickなどのBSDFのローブに対してretroreflectiveのboolのパラメータを追加し、そのパラメータに応じてView方向を反転させる実装になっています。

fn reflection_view(&self, wo: Vec3) -> Vec3 {
    if self.retroreflective {
        Vec3::new(-wo.x, -wo.y, wo.z)
    } else {
        wo
    }
}

この実装を使ってレンダリングした画像がこちらです。

spp1024-scene67-mis.png

左側は反射材部分のマテリアルとしてOren-Nayarのベースの拡散反射の上にgeneralized_schlickのGGXのスペキュラー成分をレイヤーした普通のプラスチックをイメージしたマテリアルを利用しています。 右側の反射材部分のマテリアルとしてOren-Nayarのベースの拡散反射の上に本手法のMRMなgeneralized_schlickをレイヤーした再帰反射のマテリアルを利用しています。

このシーンではカメラのすぐ後ろに小さい光源を配置しています。 MRMが光源の方向である入射方向に対して強く光を散乱させていることがわかります。

感想

この論文は経験的にview方向を反転したローブを作っているだけという若干胡散臭いモデルですが、実用上は役に立つと感じました。 エネルギー保存と相反性は満たすように整理はされているので物理ベースとは呼べないまでもレンダリング用BSDFとしては大きな問題はないでしょう。

物理ベースではないという点に関しては、この手法で反転される元のローブ自体は物理ベースのGGXなどであっても、このMRMの方の反転させるというロジック自体は少なくとも微細構造を直接モデル化した物理ベースモデルではありません。 論文自身もこの手法は物理ベースではなく経験的な手法であると明記しています。 あくまで、再帰反射を起こすガラスビーズとかの構造を真面目にモデリングしたのではなく、それの起こす視線方向に反射を返すという現象を経験的にモデリングしたものという形になります。

それでもMaterialXに早速採用されているなど、経験的モデルとしては十分実用的なモデルと思われます。 MaterialXに物理的な根拠が微妙なモデルがNPRの文脈以外で普通に入ってくるのはちょっと意外でしたが、確かにこういうローブがないと反射材のような見た目を作るのが他のローブの合成では難しいため必要性はわかります。 エネルギー保存や相反性は示されているため、物理ベースのマテリアルと混ぜても問題なく使える点でも問題なさそうです。 このMRMがMaterialXに搭載されるというのは、なにより現場としての使いやすさとかがかなり評価されてそうなことが伺えます。

また、この手法はView方向を反転させるだけという単純なものなので、ゲームなどでも十分問題なく使えるモデルです。 むしろゲームのような動的な場所で使ったほうが静止画のレンダリングより面白いでしょう。 ヘッドライトのついたキャラクターや懐中電灯を持っているキャラクターなどのカメラの方から光を照らす状況に置いてこの再帰反射のマテリアルは反射板の見た目をよく反映して面白い見た目になると思います。

まとめ

以上、MRMの簡単な紹介でした。 既存のGGXに対して非常に簡単な変更でこのような印象的な反射モデルを作れるのは面白く使いどころも多そうなので紹介の記事を書いてみました。 参考になれば幸いです。

ゲーム系の人などは簡単に試せると思うので ぜひこのモデルをちょっと試してみてはいかがでしょうか?

コメント (0)