strange items(楽天)


shade10.5〜15用スクリプト(WINDOWS&MAC用)一覧はこちらです。


bannerst.jpg
リンク用のバナーです。
リンクはご自由にどうぞ。

2015年07月17日

shade用スクリプトその93(リフレクションシェーダー)

リフレクションシェーダー.txt

このスクリプトは、私が以前作った「ベルベットシェーダー」や「グラデーションシェーダー」スクリプトと同じように、レンダリング後の画像をスクリプトで加工する事によって、一部の形状の材質の見映えをもっと良くしようというスクリプトです。

マルチパスレンダリングの「XY法線画像」(今回はカラーの画像)をスクリプト内の計算で使いますため、それが生成できないbasicユーザーさんは申し訳ないのですがご利用できず、standard版とprofessional版用となっています。
利用できるshadeのバージョンは、12,13,14,15(とそれ以降)となっています。
(XY法線画像の仕様が12以後で少し変わったため、11以前では使えません。)


<このスクリプトの利点とは?>
以前このブログでも書いたのですが、現状のshadeでは特定の形状だけをライトで照らせる「セレクティブライト」という機能が搭載されていません。
セレクティブライトは、一部のオブジェクトの見映えをもっと良くするためにあると便利なので他の3DCGソフトにはわりと搭載されている機能なのですが、shadeにはまだ実装されておらず、それを補う形で「形状個別に設定できる環境マップを使って、特定の形状にだけ追加の光沢や照明効果を加える」というテクを使う事になります。
ただ、この環境マップの画像の投影方式には残念ながらスフィアマップ形式(lightprobe画像をそのまま使えるやつ)がありません。
shadeも背景に画像をセットする場合は「ライトプローブ」用の投影手法が選択できるのですが、個別の形状に設定する表面材質の環境マップの方では、「球投影」とはまた違うライトプローブ画像をそのまま使える「スフィアマップ投影」が搭載されていないのです。

lightprobe型の投影手法(スフィアマップ)というのは、

リフレク001.jpg

これはまぁshadeで作ったやつですが、こんな感じで「球に周囲の映像が映りこんでる」という画像ですね。
検索エンジンで「lightprobe」と画像検索をすると、腐るほどこういう画像が出てくると思います。
こういう画像が環境マップとして使えるようになる投影手法です。

lightprobe型の投影手法で環境マップできるようになると、「狙った箇所に光沢や照明効果を追加しやすい」という利点や、「他の投影手法では継ぎ目が映りこんでしまう事がある」というのを回避できる利点があるのです。

で、このスクリプトでは、マルチパスレンダリングで作った「XY法線画像」で各ピクセル毎に法線ベクトルを調べ、それを元に(専用のパートに)セットしてあるlightprobe型の球画像の中心から、上下や左右の方向へピクセルを検索して色を拾い、レンダリング後の画像の一部の形状の表面材質だけ「描き変え」をしたり、「加算(光沢や照明、メタリックな質感を与える)」、「減算」、「1.何倍(加算とは違う明るくなる方法)」や「乗算」などの処理をやるのです。

まぁ、難しい事はおいておいて、実際に使ってみてその効果を確認してみましょう。


<使用方法>
このスクリプトではレンダリング後の画像を描き変えるため(「出力先」オプションが「レンダリング画像」の場合)、スクリプトを実行する前にファイル名を変えて元のファイルを残しておくか、私が以前作った「レンダリング後画像のコピーと復帰」スクリプトを使って、レンダリング画像のバックアップを取っておいてください。
「レンダリング後画像のコピーと復帰」でできたパート(表面材質のマッピングレイヤーにレンダリング画像がコピーされている)は、念のため三個くらい複製しておくと「レンダリング画像を戻すつもりが、間違ってコピーして上書きしてしまった…」というのを回避できるでしょう。


さて、スクリプトを動作させるための条件としては、まずはイメージウインドウ(レンダリングウインドウ)のオプションの「マルチパス」タブで「マルチパスを保持する」をON、「データ:XY法線」のチェックをON、「データ:表面材質ID」のチェックをONにしてレンダリングをしてください。
レンダリングが終了しましたら、レンダリング画像の方はこれで準備okです。

で、lightprobe画像はどこにセットするかというと、パートを作成し、そのパート内は必ず空のままにした上で、パートに表面材質を作成し、必ずマッピングレイヤー1にlightprobe画像(ネットで拾ったのでもいいし、shadeやペイントソフトで作ったのでもいいです)をセットしてください。
もしlightprobe画像を変更する場合は、このマッピングレイヤー1の画像を変えてください。

また、lightprobe画像の注意点としては、必ず画像の中心と球の中心が一致している必要があります。トリミングなどを行う場合は、その点に注意してください。
それを満たしておけば、画像自体の縦横のピクセル数が1:1でなくてもいいですし、球が画像のフレームよりわりと小さい場合も、その点についてはスクリプトの特定のパラメーターで調整できるようになっています。

次に、スクリプトを起動する前に「効果を適用したい表面材質の表面材質IDカラー」というのを調べておく必要があります。
レンダリングウインドウの下部にあるセレクタを「RGB」から「表面材質ID」に切り替えて、その色をペイントソフトなどへプリントスクリーンなどで持っていき、スポイトツールなどで正確なRGB値を調べておいてください。
表面材質を変更してレンダリングをやり直しした場合、時々この色が変化してしまうのには注意してください。
そして、スクリプト実行前には、レンダリングウインドウに表示される画像は、先ほどの下部のセレクタを「表面材質ID」から必ず「RGB」に戻しておいてください。

で、lightprobe画像をマッピングレイヤー1にセットしてある空のパートを選択状態で、この「リフレクションシェーダー」スクリプトを実行すると設定ダイアログが開きます。

リフレク002.jpg

効果がわかりやすいよう、今回はこんなシンプルな形状のレンダリング画像をスクリプトで加工してみます。

スクリプトを起動すると、

リフレク003.jpg

みたいなダイアログが現れます。

上からパラメーターを順に見ていきますと・・・・・

まずは「対象」というのがあり、「全ての形状」と「指定の表面材質のみ」の二択から選べます。
「全ての形状」の場合はレンダリング画像の全部のピクセルに処理を施し、「指定の表面材質のみ」の場合は、先ほど調べた表面材質IDカラーの部分にのみ処理を施せます。(全ての形状の場合は、疑似アンチエイリアスがOFFになります)
たいていは、この「対象」は「指定の表面材質のみ」の方を選ぶ事になるでしょう。

この次にある「操作する箇所の表面材質IDカラー」のカラーボックスで、先ほど調べた色をR,G,B値をできるだけ正確に入力します。
ちなみに各種パラメーターは、一部を除きスクリプト起動後は選択している空のパート名が「リフレク:」と変更された上で、各パラメーターの値を記録しておくようになっていますので、レンダリングをやり直して表面材質IDカラーが変更されない限りは、一度設定した表面材質IDカラーは再設定する必要はありません。
この「リフレク:」というパートは、名前の「:」の後ろならばどんな文字列を入れてもいいですし、複製して設定値を複数シーンファイルに保存しておく事も可能です。
以前の設定値でスクリプトを実行したい場合は、この「リフレク:」をブラウザで選択した状態で「リフレクションシェーダー」スクリプトを起動してください。


さて、次のパラメーターの「球画像の半径の倍率」ですが、lightprobe画像の球が画像のサイズぎりぎりまでの場合はデフォルトの1か、少し小さい値にします。
でも、もし

リフレク004.jpg

これは極端な例ですが、こんな感じで画像の外枠と球の間に結構な隙間がある場合は、この「球画像の半径の倍率」を1よりもっと小さくして、スクリプトが球の中心を基点として色を拾う作業を行う時の「半径」を縮小させます。
球の外側に結構な隙間がある場合、デフォルトの1という数値では、球の外側の黒いエリアのピクセルも拾って環境マップとして映りこませてしまうため、ここの「半径の倍率」の値を適切に設定して、球からはみ出さないようにするわけです。
あまり低すぎる値にすると、今度は球の中心近くのピクセルしか拾わなくなるので注意。

次のパラメーターの「画像のコントラスト調整」は、lightprobe画像をスクリプト内部でコントラスト調整します。1より大きい値にしてコントラストをきつめにしたり、1より低い値にしてコントラストを低くさせたり。

「適用率」は、モードが「描き変え」「描き変え後、元画像の明度を乗算」の場合は意味をなしませんが、「加算」「減算」「1.何倍」「乗算」の場合は、適用率を下げていって0に近づくほど効果が薄くなります。

「明度の持ち上げ量」のパラメーターは「描き変え後、元画像の明度を乗算」の場合にのみ意味のあるパラメーターです。
「グラデーションシェーダー」スクリプトでもあったような機能で、「元画像の明度を乗算したら暗くなりすぎた」みたいな場合、ここの値を0.いくらかにして少しだけ明度を持ち上げてやるのです。
なお、最大の1にすると「描き変え」と同じ結果になります。

「暗部は残す」と「暗部閾値」の二つのパラメーターは後で説明します。

「疑似アンチエイリアス」の項目は、スクリプトで材質を変化させるオブジェクトの境界あたりにできてしまいがちなジャギーを多少緩和させます。(アンチエイリアス品質はあまりよくありません)
もしオブジェクトの輪郭あたりに不自然な映り込みができた場合は、まずは「球画像の半径の倍率」の方で適切な数値を設定した上で、この「アンチエイリアス」をONにすると解消できます。
残念ながらオブジェクトの外周ではなく内部に不自然なジャギーが発生した場合は、このアンチエイリアスオプションでは解消できません。


「出力先」パラメータでは「別ウインドウ(テストレンダ)」と「レンダリング画像」の二種類から選べるのですが、「レンダリング画像」の方を選択するとレンダリング画像を描き変えてしまいます。(間違って選択した場合も「結果を確定」の時にキャンセルできますが)
「別ウインドウ(テストレンダ)」なら、レンダリング画像を描き変える事なく、別ウインドウに小さいサイズで色々なパラメーターで描き変えた画像を確認できますので、テストレンダを繰り返してから、気に入った結果になったら「レンダリング画像」に切り替えてください。
テストレンダリングウインドウは同じ位置に次々と開きますので、こまめに「x」ボタンを押してテストウインドウを閉じていってください。(スクリプト実行中はウインドウは消せないので、一旦スクリプトを終了してから不要なテストウインドウを閉じてください)

「テストレンダ時パラメータも出力する」のチェックがONの場合、各パラメータ値がshadeのメッセージウインドウに出力されますので、テストレンダリング用のウインドウIDと各種パラメーター値を見て、後で気に入った設定を手入力で再現できます。
(出力されるパラメーター値は、微妙に小数点以下が足したり減ったりしていますので、その部分は修正して入力してください)

「テストレンダのサイズ」では、テストレンダウインドウのサイズを選べて、小さい画面ほど早く結果が確認できます。


それでは、「モード」ごとの違いを見ていきましょう。

リフレク001.jpg

のlightprobe画像を使って

リフレク002.jpg

の材質変化をさせた場合、

リフレク005.jpg
モードが「描き変え」だと、上記のように元の色を無視して丸ごと描き変えて、環境マップ風になります。

リフレク006.jpg
モードが「描き変え後、元画像の明度を乗算」だと、上記のように元の色を無視して丸ごと描き変えた後、元画像の明度を乗算して少し立体感のある環境マップになります。
(この例では多少明度をもちあげています)

リフレク007.jpg
上記は「加算」モードです。(適用率は低めにしました)
元の画像の色に、環境マップのlightprobe画像から拾った色を加算合成しています。

lightprobe画像を
リフレク008.jpg
に替えて加算モードにした場合は、

リフレク009.jpg
上記のように、特定の形状にだけ光沢や照明効果を追加して見映えを良くする「セレクティブライト」的な事ができます。
「加算」モードでは、lightprobe画像の方を工夫すれば、輪郭部分近くだけを明るくするリムライト的な効果を指定の材質にだけ付与する事もできますし、トゥーンレンダリング画像でキャラの髪にアニメ的なツヤの輪っかを追加する事もできます。(…が、髪ツヤ追加の場合は、ツヤの位置調整をlightprobe画像側で設定するのですが、それが結構難しいかも?)
「スフィアマップ」で画像検索すると、アニメ的な髪ツヤ画像の作り方や、髪ツヤ用のスフィアマップ画像を配布しているサイトがいくつも見つかるでしょう。

リフレク010.jpg
上記は「減算」モードですが、搭載したものの、このモードはいまいち使い勝手がよくわかりませんね。
ぼかしたメタリック状の球をlightprobeとして適用率を下げて減算合成すると、汚し的な感じにできるかも?

リフレク011.jpg
これは「1.何倍」モードです。
「加算」はlightprobe画像のピクセルから拾った色のRGB値を足しているのに対して、こっちはその値をRGBごとに1に足して掛けています。
加算モードとはまた違う照明効果を加える事ができます。

リフレク012.jpg
上記は「乗算」モードです。
このlightprobeだといまいち使い勝手がわからないと思いますが、

リフレク013.jpg
これみたいに、ペイントソフトで作った円形グラデーションをlightprobe画像として設定すると、

リフレク014.jpg
上記のように、「視線との角度が平行に近づいていくにつれ、赤味が増していく」みたいにできます。
スキンシェーダーとは違うのですが、人物モデルでキャラクターの肌にこれをやると、肌により立体感が出たりします。

肌150715001.jpg

肌150715002.jpg

テクスチャでまつ毛や眉毛を描きこんでいる場合、まつ気や眉毛も赤味が増すのが難点ですが。


最後に、説明を省略していた「暗部は残す」と「暗部閾値」の二つについて解説します。

形状の材質を少し変えて、こんなのをレンダリングしてみました。

リフレク015.jpg

黒のストライプを拡散反射と光沢1に設定しました。
この黒い部分は、メカなどでの「筋彫り用の黒い線」みたいに思ってください。
メカのテクスチャリングでは、黒い線を拡散マップや光沢マップの乗算モードなどで追加したりする事がありますよね。
筋彫り部分は光沢や拡散光で明るくならないために。

通常の方式で、この「リフレクションシェーダー」で処理をすると、

リフレク017.jpg
これは加算モードですが、こんな感じで、一部のモードでは筋彫りの黒の部分を無視して明るくしてしまいます。
「加算モードを使えば、セレクティブライト的に一部の形状に追加の光沢や照明効果を加え、見映えをもっと良くする事ができる」と言っても、筋彫りの黒の部分が死んでしまっては意味がないわけです。

でも、この「暗部は残す」をONで、「暗部閾値」は1で加算モードをやってみると、

リフレク018.jpg
こんな感じで、筋彫りの黒(暗部)にはあまり影響を与えずに、他の部分に光沢や照明効果を追加できるのです。

スクリプトでやっている事は、ピクセル単位でレンダリング画像の元の明度を調べ、その明度で適用率を変更させています。黒に近いピクセルほど適用率を落としていく、という感じで、暗部にできるだけ影響を与えないようにしてるわけです。
「暗部閾値」は、「この明度以下のピクセルでないと適用率操作をしない」という設定値で、基本的に1でいいと思いますが、1より下げていく事でまた違った効果が出るでしょう。
しかし、1より下げた場合は、材質に辺な境界線ができたり、疑似アンチエイリアスONでは消せないジャギーが発生しがちなので注意してください。

posted by stxsi at 17:47| shadeスクリプト | このブログの読者になる | 更新情報をチェックする