modoのシェーディング率について書いてみたいと思います。ぼけてないシャープな反射、影、テクスチャを綺麗にレンダリングするには「シェーディング率」を0.1に設定してレンダリングした方がいいという話です。
一般的にレンダリングの綺麗さは以下のパラメータで決まります。ここでいう綺麗さはピクセルの品質のことです。GIの計算とかシェーディングアルゴリズムよりもCGの基礎の話です。
- アンチエイリアシング
- シェーディング率
- サンプル数
アンチエイリアシングとは
アンチエイリアシングはレンダリング画像のジャギを滑らかにする処理です。アンチエイリアシングを使用するとチラツキがなくなり自然なアニメーションを作成することができます。
単純なアンチエイリアシング処理だとゲームで使われていたポストプロセス処理があります。周辺のピクセルの平均色を使用する方法でFXAAやTXAAというやつです。アンチエイリアシングの詳細はこちらの記事がわかりやすいです。
しかし3DCGは無限にズーム可能なので、ポストプロセスのようにピクセル単位で色を決めると情報が欠落してしまい正確なピクセル色になりません。アンチエイリアシングがポストプロセス処理のゲームを遊んだとき、オブジェクトの境界でチラツキ(クローリー)が発生するのを見かけたことがあると思います。
以下の画像はNvidia コントロールパネルを使用してmodoのビューポートにFXAAを適用したものです。
オブジェクトの境界を300%に拡大した画像です。FXAAはポストエフェクトなので静止してる場合はアンチエイリアシングが掛かって綺麗に見えますが、ビューが動くと階段状のチラツキ(クローリー)が発生しているのが確認できます。
ゲームは応答速度が重要なのでジャギやチラツキは許容されますが、映像目的のプリレンダリングではチラツキやノイズは好まれません。このため昔から3Dソフトのアンチエイリアシング処理は、1ピクセルを分割しサブピクセルをサンプリングしてピクセルの色を決定します。
例えば1ピクセルを4分割する場合、アンチエイリアシングがない状態で4倍の解像度でレンダリングするのと同じくらいの計算コストが掛かります。アンチエイリアシングのサンプル数を高くすることで、正確なピクセル色を得ることができますがレンダリング時間が長くなってしまいます。
全てのピクセルを分割するとレンダリング時間が長くなるので、レンダリング時間を短くする工夫として、3Dソフトのレンダラーはオブジェクトの境界を集中的にアンチエイリアシング処理するのが一般的です。
たとえば3dsMaxのスキャンラインレンダラーでレンダリングした画像です。Maxのスキャンラインレンダラーは2000年頃からほとんど変わってなくて、デフォルトでは鏡面部分のシェーディングでサブピクセルがほとんど考慮されない設定になってます。
同じ問題はmodoでも発生します。下の画像はmodoのデフォルト設定でレンダリングした画像です。球体の輪郭に比べて、シェーディング部分がジャギってるのがわかると思います。
ここまで前置きです。シェーディング部分のジャギを軽減するために使用するのが「シェーディング率」です。レダリングパフォーマンス上げるために、アンチエイリアシングからシェーディングを切り離すために考案されました。
シェーディング率
「シェーディング率」はシェーディング部分のサンプリングを増やすことでジャギを軽減します。反射、影、テクスチャのジャギが発生したら、シェーディング率を0.1や0のように小さな値を設定することで改善することができます。
シェーディング率はアンチエイリアシングと関係していて、シェーディング率 0.5は1ピクセルあたり4サンプル、0.25は16サンプリング、0.1は1ピクセルあたり100サンプリングのようにサンプルが増えるらしい。
下の画像は「シェーディング率」 の比較画像です。シェーディング部分のジャギが改善しているのを確認することができます。
リファインメントしきい値 と リファインメントシェーディング率
「シェーディング率」の下には「リファインメントシェーディング率」「リファインメントしきい値」というパラメータがあります。これはレンダリングを最適化するためのパラメータです。「リファインメントしきい値」で設定されたしきい値内のピクセルのみ「リファインメントシェーディング率」で設定された値でサンプリングします。
modoは「シェーディング率」と「リファインメントシェーディング率」で値が低い方の設定を採用するようです。デフォルトでは「シェーディング率」が0.5、「リファインメントシェーディング率」が1.0に設定されているため、「リファインメントシェーディング率」が使用されることはないようです。通常は「シェーディング率」だけ設定しておけば問題ないと思います。
「リファインメントしきい値」の動作が気になたのでアニメーションしてみました。
色の差が大きいピクセルから徐々に滑らかになるのが確認できます。有効に動作しそうなのは50%以下で、0%になると全てのピクセルがサンプリングされるためテクスチャがぼけたように見えます。
左はテクスチャのみ、右はテクスチャとバンプです。バンプを使用するとシェーディングでチラツキが発生しやすくなります。
UV確認用のテクスチャ、テクスチャの模様が滑らかに変化するのが確認できます。AEにいれてコマ送りでみると変化がよくわかると思います。
反射サンプル と シェーディング率
「ブラー反射」を使用した場合にノイズが軽減するかテストしてみました。シェーディング率を下げるとノイズが少しぼけますが、ノイズそのものへの影響が少ないことが確認できます。反射やGIのノイズを軽減したい場合は、サンプル数を増やした方がよいです。
反射サンプル:64、シェーディング率:0.5
反射サンプル:64、シェーディング率:0.1
反射サンプル:1024、シェーディング率:0.5
反射サンプル:1024、シェーディング率:0.1
「シェーディング率」はRender設定の他に、Shaderにもパラメータが存在します。
Renderのシェーディング率はシーン内の全てのマテリアルに影響しますが、Shaderは特定のマテリアルだけシェーディング率を上げることができます。
modoはRender設定とShaderのうち値が低い方のシェーディング率を採用するようです。またShaderはサンプリングのグループを結合する役目があるようです(後述)。アニメーションなどでレンダリング時間を最適化したい場合は、Shader単位で設定が変えられるのが便利ですね。
Shaded AA Samples Output
modoのレンダー出力には、アンチエイリアシングとシェーディング率のサンプリングを確認するための出力「Shaded AA Samples Output」があります。Shaded AA Samples Outputはピクセルのサンプリングの割合を視覚化した物で、1回のサンプリングで終了しているピクセルは青、設定の上限までサンプリングされたピクセルが赤で表示されます。適切なサンプリングが行われてるか確認するのに役立ちます。シェーディング率を0.1にすると全てのピクセルが赤になります。
以下の画像はシェーディング率0.5で、アンチエイリアシングの設定を上げた場合のShaded AA Samples Outputです。アンチエイリアシングを上げると青になるのはピクセルあたりのサンプリング数が増えるため、サンプリングの上限に達する前に計算が打ち切られてるってことかな?このことからアンチエイリアシングを上げた場合はシェーディング率を0.1で固定するよりは、シェーディング率を0.25とか適度に設定した方が効率的にレンダリングできるのかもしれない。
アンチエイリアシング : 8サンプル/ピクセル
アンチエイリアシング : 16サンプル/ピクセル
アンチエイリアシング : 32サンプル/ピクセル
アンチエイリアシング : 64サンプル/ピクセル
色がブロックのようにまとまってるのは、シェーディング部分の効率化による物です。サーフェース上のサンプリングが近い場合、グループとして結合することでシェディングの計算を効率化しているとのことです。
このサンプリングのグループ化は、Shaderのシェーディング率の値によって許容量が決定されるらしい。シェーディング率が1.0の場合、ピクセル内のすべてのサンプルが1つのグループとしてシェーディングけされる可能性がある。
modoのデフォルトのレンダリング設定は、速さを優先しているように思います。最終レンダリング時には「シェーディング率」は0.1のように低い値に設定するのがお勧めです。「シェーディング率」を下げてモアレやチラツキが酷いときに、はじめてアンチエイリアシングのサンプル数を上げるのがよいのではないでしょうか。
MentalRayやArnoldのようなプロダクション向けのレンダラーは、デフォルトでシェーディング部分をある程度サンプリングする設定になってます。そのため、はじめてレンダリングしたときはレンダリングの遅さが気になったりします。
ちなみにMaxでは「スーパーサンプリング」を使用するすことでシェーディング部分のジャギを消すことができます。
参考
https://community.foundry.com/discuss/post/339862
https://community.foundry.com/discuss/post/808199
https://www.linkedin.com/pulse/modo-renderer-gets-overhaul-shane-griffith/
Modoのレンダラは、2003年にグローバルイルミネーション技法と既存のプロダクションレンダラのパフォーマンスの問題点を改善するために設計されました。当時はグローバルイルミネーションがプロダクションで使用されることはほとんどありませんでした。高パフォーマンスレンダリングの鍵は、高品質のアンチエイリアシング(つまりアンチエイリアシングからシェーディングを切り離す)を維持しながら、直接表示されるサーフェスのシェーディング評価の回数を減らすことでした。PRManのREYESアルゴリズムは、各ピクセル内のより高い密度での視認性を評価する前に低密度でマイクロポリゴンのグリッドをシェーディングすることによってこれを達成した。
デフォルトmodoレンダラのパフォーマンス上の利点の秘密は、まず高密度での可視性のサンプリングとREYESの順序を逆にし、次に遅延シェーディングフェーズ(後にLuxology社が特許を取得したアイデア)の前に近くの類似したサンプルをマージすることです。すべてのサーフェスをさいの目に切ってマイクロポリゴンにする必要がないため、この方法はレイトレーシングに適していました。その後、物理ベースのレンダリングの人気が高まるにつれ、この方法が有益であることがわかりました。