シェーダーについて
シェーダーとは文字通り影を作ってくれるものです。
実際には影や凹凸や質感を描画してくれるプログラムの事を指します。
上の画像のように、実際は単純な正方形・球体・三角錐のメッシュでも右型のメッシュはシェーダーによって凹凸等が作成され、ライティングによりその凸凹の情報を基に影が描画され、ぱっと見では作り込まれたメッシュのように見えます。
マテリアルについて
マテリアルは質感設定のようなものです。
DCC(3Dモデリングツール)を使っている人にとってはお馴染みのものです。
このマテリアルのSurfaceプロパティを基にシェーダーが凹凸等を作成してくれます。
UnrealEngine等のゲームエンジンがライトプロパティを作成し、シェーダーが作成した凹凸情報から影を描画します。
ちなみにシェーダーには互換性が無いのでBlenderで頑張って作成したマテリアルをそのままUnrealEngineで使用する事は出来ません。
UnrealEngineでUnrealEngine用のマテリアルを作成する必要があります。
なのでBlenderでマテリアルを作成する場合は、Meshのマテリアル適用箇所とテクスチャ程度に留めて、Surfaceプロパティ関連はUnrealEngineで煮詰めます。
マテリアル作成とマテリアルドメイン
UnrealEngineでマテリアルを作成するには、ContentBrowserのAdd/Importボタンをクリックし、Materialを選択します。
新しいマテリアルが作成されるので、選択してF2キーを押して名前をM_Tempに変更します。
M_Tempをダブルクリックすると、マテリアルエディターが開かれます。
グラフ上のM_Tempノード(マテリアルに付けた名称のノード)を選択し、DetailsのMaterial Domainのリストをクリックします。
この
マテリアルドメインが非常に重要で、
現在編集中のマテリアルが何に使用されるかによって使用するマテリアルドメインを変更する必要があります。
例えばUser Interfaceに設定した場合、このようにノードピンが殆ど無くなります。
理由は単純にUIはゲーム中のライティングとブレンドする必要が無い・・・早い話がUIはゲーム上のライトに関係無く表示される必要があるので、Surface関連のノードピンは不要だからです。
ゲーム中に暗い場所に行ったらUIも暗くなって見えなくなった・・・なんて事になったらユーザーからバグ報告が来てしまいます。
マテリアル入力
マテリアルドメインをSurfaceに戻して、
マテリアル入力のピンを確認しましょう。
この各
マテリアル入力が、色・凹凸・粗さ・発光等の設定値となります。
グラフ上で右クリックしConstantを選択します
(または
ショートカットキーの1を押しながらグラフ上の適当な場所をクリックします)。
Constantノードが追加されるのでRoughnessに接続します。
ConstantノードをクリックするとDetailsで定数の値が0になっているので、粗さ0のマテリアルになってプレビューを見るとピカピカしている事を確認出来ます。
続いてScalarParameterノード(ショートカットキー:S)を追加し、DetailsでValueを0.05に設定し、Emissive Colorに接続すると少し発光する事を確認出来ます。
ScalarParameterノードを使用すると、後でブループリントからScalarParameterの値を変更する事が可能になります。
要するにこのマテリアルのインプットのように扱う事が出来ます。
続いてVectorParameterノード(ショートカットキー:V)を追加し、Deafult Valueで適当な色を設定し、
VectorParameterノードの白いピンをBaseColorに接続し、色が変化する事を確認します。
固定の色で良いならConstant3Vectorノード(ショートカットキー:3)を使用します。
テクスチャを使用したい場合はTextureSampleノード(ショートカットキー:T)を使用し、BaseColorに繋げます。
DetailsのTextureで適当な画像を選択し、プレビューをSphereからCubeに変更してテクスチャが反映されている事を確認します。
法線(Normal)について
法線(英語ではNormal)は表面の形状を定義する為のものです。
早い話が凸凹の情報です。この情報とライティングによって表面に影が作成されます。
スタートアップコンテンツのMaterialsフォルダにあるM_CobbleStone_Roughをコピペして、M_CobbleStone_Rough_2を生成します。
M_CobbleStone_Rough_2を開き、Normalピンの接続を切断(Altキーを押しながらNormalピンをクリック)します。
レベル上に適当なMeshを配置し、M_CobbleStone_Rough_2をMeshにドラッグ&ドロップして適当し、ポイントライトで照らすと凹凸が無くなり立体感が無くなります。
M_CobbleStone_Roughのマテリアルには下図のような法線マップが使用されていて、この法線マップが凸凹の基になります。
法線マップについてここでは詳しく説明はしませんが、赤と緑が深さの情報で、青が表面の情報を表現しています。
Unityのドキュメントに法線マップの解説がありますので、詳細を知りたい人はそちらを参照して下さい。
BaseColorに白を設定し、BaseColorとNormal以外を切断すると、どのように作用するか視覚的に分かります。
ちなみにLキーを押しながらマテリアルエディターのViewportを左ドラッグすると、ライトの位置を変更出来ます。
マテリアル入力のデータ型とデータ範囲
マテリアル入力のデータ型とデータ範囲があり、範囲外のデータは切り捨てられたりします。
例えば、RoughessはFloat型でデータ範囲は0~1になります。
その為、-1を設定した場合は0として扱われます。
逆に100を設定した場合は上限の1として扱われます。
Float型なので0.15のような小数点の設定値が使えます。
以下表は基本的なマテリアル入力についてまとめたものですが、詳細は公式サイトの
マテリアル入力を参照して下さい。
マテリアル入力 |
データ型 |
Min値での動作 |
Min値 |
Max値 |
Max値での動作 |
Metallic |
Float |
無し |
0 |
1 |
メタリック |
Specular |
Float |
無し |
0 |
1 |
完全反射 |
Roughness |
Float |
艶消し |
0 |
1 |
スペキュラ |
Emissive Color |
Float |
無し |
0 |
- |
発光 (1より大きい場合はHDRライティングとしてサポートされる) |
すこし特殊なのがEmissive Colorで、0~1までの範囲では発光度合いになりますが、
1を超えると外側光彩とHDRライティングとしてサポートされるようになります。
あくまでHDRライティングなのでポイントライトみたいに周囲を照らしてくれる訳ではありません。
RGBAチャンネル
先程は軽くスルーしましたが、TextureSampleに沢山の出力ピンがある事に気がついたと思います。
RGBは見ての通り色情報を持ったVector3データのマップです。
RはRedチャンネル情報を持ったFloatデータのマップです。
GはGreenチャンネル情報を持ったFloatデータのマップです。
BはBlueチャンネル情報を持ったFloatデータのマップです。
AはAlphaチャンネル情報を持ったFloatデータのマップです。
RGBAはRGBとAlphaチャンネル情報を持ったVector4データのマップです。
フォトショップ等の画像編集ソフトを使った事が無い人には「なんじゃそりゃ?」かもしれないので簡単に説明します。
説明というより実際に目で見て貰った方が早いです。
サンプル画像をダウンロードする。
とりあえずこのサンプル画像をUnrealEngineにインポートして、TextureSampleに設定します。
TextureSampleのRピンをBaseColorに接続すると、グレースケール表示になる事が確認出来ます。
グレースケールになるのはバグではありません。
インポートした画像データをダブルクリックをして、左上のViewボタンを押します。
Color ChannelsをRedにのみチェックを入れるようにするとRチャンネルの情報を確認する事が出来ます。
同様にグレースケールになっていますが、
黒い部分は0の情報を持っていて、白い部分は1の情報を持っています。
つまりRチャンネルで一番白い部分にはRedの情報が多いことを意味します。
GチャンネルやBチャンネルも同様に対応する色情報がグレースケールが表されます。
Aチャンネルも同じく透過情報がグレースケールで表され、
黒い部分は0(最も透明)の情報を持っていて、白い部分は1(最も不透明)の情報を持っています。
各チャネルをそのままBaseColorに接続する事はありません。
基本的にはマスクしたり加工する為の情報源として使用しますが、これは別途説明します。
マテリアルエディターに戻り、RGBAピンをBaseColorに接続してみましょう。
プレビューを確認すると透過部分が透明になっていない事を確認できます。
これはBaseColorのデータ型がVector3でAチャンネルに対応していないからです。
BlendModeを選択して透過に対応したマテリアルに変更します。
BlendModeを
Translucentに変更する事で透過に対応したマテリアルになりますが、処理負荷が高くなるので要注意。
マテリアル入力のピンが変わり、Opacityというピンが増えたと思います。
RGBピンをBaseColorに接続し、AピンをOpacityに接続すると、透過情報が反映されている事をプレビューで確認する事が出来ます。
マテリアルの処理負荷
透過対応のTranslucentは処理負荷が高くなると説明しましたが、実際に目で見て確かめてみましょう。
レベルマップにTranslucentのマテリアルと、スタートアップコンテンツの銅像とドアとテーブルを追加します。
ViewportのViewModeからOptimization Viewmodes -> Shader Complexityを選択します。
下部のゲージの左側(緑色)に近いほど処理負荷が低く、右側(白色)に近いほど処理負荷が高い事を意味しています。
BlendeModeがSurfaceのマテリアルは最も処理負荷が低い緑色になっており、
単純にBlendeModeにTranslucentに変更しただけのマテリアルを適用したメッシュは黒色になり若干処理負荷が高くなっている事が分かります。
そしてスタートアップコンテンツの銅像とドアのガラス部分が赤色になっており、処理負荷が高い事が目に見えて分かります。
基本的にガラス等の透過しているマテリアルは複数回レンダリングされる為、処理負荷が高くなると言われているので、余り多用し過ぎると無駄にシェーダーが悲鳴を上げてしまう事になります。