3DCGで形状を作る場合、頂点の座標で凹凸を表現して形を作る事になりますが、この手法については、通常のモデリングとは別に、先日書いたようにSculptモデリングで形状を作る方法もあります。
Sculptモデリングについては、
で使っていますが、頂点の状態を確定する場合だとモデリングで行う事になります。形状を作る場合、CADやデジタル造形の場合だと、形状を全て作る必要がありますが、3DCGの場合、テクスチャーで凹凸をコントロールする事になります。
そこで、今回は、テクスチャについて書こうかなと思います。
デ ィスプレイスメントマップを使う
3DCGで凹凸をコントロールする場合、テクスチャマップでもコントロールできるのですが、実際に頂点座標を変えれるものにバンプマップがあります。これは、グレースケールのハイトマップを使う事で凹凸の表現が出来るのですが、ソフトウェアに標準実装されているプロシージャルテクスチャでも凹凸を反映できます。例えば、
のように細分化した状態で、テクスチャのプロパティを開いてプロシージャルテクスチャを選択します。ここでノイズを選択して、モディファイヤのディスプレイスメントパップを選択すると、
のようにノイズが突起状になって反映されます。また、使用しているテクスチャを変更すると、
のように変更できます。また、ディスプレイスメントマップは重ねる事が出来るので、ベースの上にもう一度別のテクスチャを当てると、
のようになります。数値を調整すると、
のようになるのですが、数値の変更で、
のように変化させることができます。ディスプレイスメントマップは、キーフレームで制御できるので、
のような状態から、
のように変更できるのですが、これにカメラにもモーションを入れて、
のように支店の変更を追加する事ができます。こうしたものは動いている物を見た方がわかりやすいので、YouTubeに動画をアップしておきました。
■ ディスプレイスメントで動かしてみた
そして、Cyclesでレンダリングすると、
のようになりますが、デノイザーを使うと、
の状態から、
のような感じでノイズのない状態で表示されます。NCIDIAのRTXシリーズがある場合だと、OptiXが使えるので、速度が稼げるようになっていますが、Intel構成だとデノイザーを使う事で速度稼ぐことができます。
Eeveeで光の計算をする場合だと、イラディアンスボリュームを使うことになりますが、
のように伊ラディアンスボリュームを選択すると、オブジェクトが追加されます。
このオブジェクトでシーンを包む必要があるので拡大します。
この時に内側の立方体にシーンが収まるようにサイズを調整します。そして、プロパティから間接照明を選択した後に、 【 Bake Indirect Lighthing 】 のボタンをクリックします。
するとBAKEが始まり、
のようになり、光源の状態が変わります。
プレビューで確認してみると、
のようになりますが、レンダリングすると、
のようになります。イラディアンスボリュームの有無は実際に動画で比較したほうがわかりやすいので、YouTubeに動画をアップしておきました。
■ イラディアンスボリュームのテスト
このようにディスプレイスメントマップで凹凸をコントロールできるのですが、ゲームの場合だとテッセレーションでディスプレイスメントマップを用います。これは、距離に応じたトポロジーの処理になりますが、元のオブジェクトをローポリにしておいて、ディスプレイスメントマップなどを適応して最適な場遺体になるようにしたマップを用意しておき、距離が近づいた時にポリゴン数を増やしてディスプレイスメントマップな度を用いて凹凸の再現をするという手法です。基本的にバンプマップを用いた処理なので、POM同様に処理が重くなりますが、ゲームに実装するモデルのポリゴン数を下げて、視界に入るオブジェクトのラダムウォークが発生しても負荷が上がらないようにする事が出来る(コリジョンが増えるので、そうした演算は別ですが、アクションの発生時の頂点座標の変動の総数は減るのでその演算に関しては軽量化が図れます。)という利点があります。ただし、見えている場所はポリゴン数がかさむので、そう言った処理が大丈夫な環境だと便利な機能ですが、マシンスペックが低い場合には使用できない処理になります。
この辺りは、POM対応のゲームでも適応するとfps数が下がってしまうような環境だと、機能をオフにしてプレイする事になるのと同じですが、機能的には、そう言った方法でディテール高くする方法があります。頂点自体が移動すると、影の計算は、サーフェスを基準に行われるので、光源とオブジェクトの位置関係が変わっても手セルフシャドウを使った場合には正しい影の計算が出来るというメリットがあります。
P BRとプリンシプルBSDF
ディスプレイスメントマップは、モディファイヤで適応できますが、ノードでも指定できるので複雑な構造にすることも可能になっているのですが、マテリアルの指定も複数のテクスチャを使って質感を追い込むことができます。現在は、物理ベースのノードを使った設定が出来るので、複数のノードが合わさったものを使って質感を調整する事が出来るようになっています。
マインクラフト統合版のWINDOWS 10版では、現在RTXのベータ版が配布されていますが、RTXでは、従来のベースカラー(アルベドやデフューズマップに該当します。)のみの指定ではなく、PBRの設定が可能になっています。
PBRの基本的な考え方ですが、反射の種類と荒さで質感を決めます。この時に、
■ 金属 (Metaliv)
■ 非金属(Specular)
のように全く反射が異なる物を用いて、光沢の種類の差を指定します。また、双方が0~1までの状態で組み合わさったときにも異なるマテリアルが出来るので、それを含めるだけでもグレア素材や鏡面反射をするものが作れます。映り込むほど表面が滑らかな状態であっても、アクリル板と金属では異なりますから、そう言った違いをここで作ります。そして、この状態だとグレア素材なので、マット素材を作るためのパラメーターとして、
■ 粗さ(roughness)
を用います。これで質感の表現はできますが、あくまでも、このパラメーターは 【 質感 】 であって、 【 色彩 】 ではありません。その為、この質感に対して色のパラメーターを用意します。
■ 色彩(Albedo)
を用いることで、質感が変わります。例えば、金属の要素が1で、色彩が黄色だと、金色に見えると思います。メタリックな質感にする場合にはメタルになりますが、この金属っぽさを低くすると樹脂のような表現になります。この状態だと、光の影響でハイライトと影が出るだけでなく、映り込みや反射の指定もできますが、ここまでのパラメーターを見ると、 【 発光体 】 が存在しません。これについては、別のパラメーターを使うことになりますが、Bloomのような処理はポストエフェクトになりますから、レンダリング後の画像に処理を加えるような状態になります。こうした処理が可能なので、サーフェスの計算だけでは対応できないものが表示できる世になっています。
Blenderでは、放射BSDFを使うと発行体の強さを制御できますが、この場合には、単体で光を放たないパラメーターだけの指定とは異なる設定が必要になります。WEB-GLでもPBRを用いた質感の設定が可能で、Bloomも適応できるようになっているのですが、ゲームもPS3の時代には複数のテクスチャを使った質感の表現が可能になっていましたから、これが異なるアプローチで使用できるようになっているのが、近年のゲームグラフィックという事になります。とは言っても、ここにシェーダーなども関係してきますし、それに合わせたテクスチャの作り方も必要になってきますから、どう言った質感のシェーダーを用いて表示をするのかで、モデルの作り方やテクスチャの表現も変わってきます。
Blenderでは、2.79bでもプリンシプルBSDFが実装されており、それを使う事で、一つのノードで複数のBSDFの指定が可能になります。
Blendeを立ち上げると、
の画面になりますが、今回は、このCUBEを使うことにします。2.79bなでは、自動展開にチェックを入れると、球体などもきれいに開いてくれるようになっていましたが、2.8以降では、シェイプについては自動で展開してくれる仕様になっています。
今回は、このオブジェクトに
のようなテクスチャを適応する事にします。
ノーマルマップですが、グレースケールのテクスチャを作ると、ディスプレイスメントマップとして使用できますが、その画像をGIMPに持っていくとノーマルマップに変換できるので、今回はGIMPを用いて変換をしています。
まず、メタリックに二値のテクスチャを当てるので、
のようにメタリックの横の ● をクリックしてメニューを開きます。
そしてその中から、画像テクスチャを選択します。
すると、
のような画面になり、メタリックの下に
のような表記になるので、二値のテクスチャを読み込みます。そして、同様にベースカラーも選択して、
画像を適応します。こちらはグレースケールの物を追加します。すると、
のようになり、粗さが適応されていますが、反射はしていません。これは、 【 スクリーンスペース反射 】 が適応されていないので、反射そのものが反映されていないのですが、
のように
■ スクリーンスペース反射
■ Refrection
の二つの項目にチェックを入れます。しかし、この状態だとマットな質感になっているので、
の粗さの数値を0にすると、
のように反射が反映されます。さらに、
で反射キューブマップを追加し、プロパティでキューブにします。そしてサイズを合わせて、Monkyを追加すると、
のように映り込みが発生します。
テ クスチャペイント
読み込んだテクスチャはテクスチャペイントで直接描けるのですが、
のようにベースカラーのテクスチャに色を追加すると、
のように色が加わり、更に加筆すると、
の世に代わります。また、テクスチャペイントでは、ブラシの形状をテクスチャの模様で塗る事が出来るので、
のようにノイズを選択して塗ると、
の様な質感になります。また、新規に立方体を作り、
のように放射BSDFを割り当てて、メタリックに適応したテクスチャを割り当てると、
のように部分的に発光します。更に、
のようにイラディアンスボリュームを追加して、
のように拡張してBAKEを行うと、
のような感じになります。
マ テリアルノードで質感を調整する
シェーダーの画面でノードを使ってマテリアルの指定をすると更に質感のコントロールが出来るのですが、
のように
■ 屈 折 (鏡面反射)
■ 放 射 (発光)
を組み合わせると、
の様な質感になり、レンダービューで見ると、
のようになります。実際にレンダリングすると、
のようにはり、発光が局部で発生しています。また、
のように質感をSSSにすると、
のように異なる質感になります。屈折も使っているので映り込みも反映されていますが、これに
のようなテクスチャを加えて、
のようなノードを組むと、
のように部分的にSSSでそれ以外の質感の場所があった素材の周辺が発行しています。つまり、この状態にすると、デフューズとSSSの合わさった質感のオオブジェクトに発光も追加できます。これをレンダリングしてみると、
のようになります。更に、明るさを調整して
のようにすると、レンダリング結果も
の世になります。これを見ると、SSSⅮの素材部分とデフューズの場所の振る舞いが異なる事が確認できます。
■ ノーマルマップ
ゲームで凹凸を入れる時に使用するマップとして色の情報の変化で立体に見えるという処理の 【 ノーマルマップ 】 があります。
今回はノーマルマップを作ったので、オブジェクトに適応していきます。まず、
のようなノードを組む事になりますが、先ほどのノードに対して、
のようにノーマルマップを適応して各BSDFのノーマルにつなぐだけです。するとマテリアルビューだと驚くほどに窪みはできます。
ただし、これをレンダリングすると、
のようにノーマルマップが適応された形跡がありません。これは、ノーマルマップのカラーの問題になりますが、sRGBで適応されている場合、レンダービューにしてみると、
のように全く効果を発揮していません。この場合、
のように 【 リニア 】 を選ぶか、 【 NoN-Color 】 を選ぶ事になります。すると、画像のように凹凸が反映されます。
画面で確認すると、
のようになりますが、ノーマルマップを適応する場合には、こう言った仕様になっているので、ノードを繋ぐだけだと、マテリアルビューでは反映されてもレンダリングをすると全く反映されないので、カラーの設定を変更する必要があります。
Eeveeを使うと、レンダリング速度を稼げるのですが、テクスチャが増えると、GPUのVRAMの使い方を気にする必要が出てきます。その為、VRAMやメモリーが足りている場合はいいのですが、EeveeはGPUレンダーなので、VRAM不足になると、Cyclesで
■ OptiX
■ CUDA
■ Open-CL
を使った時のようにVRAM不足になると落ちる事があります。その為、環境にあった作り方を模索する必要があります。
凹凸については、今回のようにディスプレイスメントマップとノーマルマップを使う方法がありますが、Eeveeでできる事はUPBGEでもできるので、こう言った質感の設定はUPBGEで作ったゲームにも反映できます。
現在のゲームエンジンはPBRに対応していますが、質感の指定はテクスチャで行います。その為、色彩だけでなく、質感をどうするのかも、テクスチャで指定する事になります。
今 回の作業環境
■ Core i5 650
■ H55M-Pro
■ DDR 1333 2GBx2+1GBx2(DUAL CH)
■ Quadro K620(PCI Express x16 【GEN2動作】)
■ SATA HDD
■ WINDOWS 10 x64 (20H2)
■ Bender 2.90 (x64)
■ Gimp 2.10.18 (x64)