読者です 読者をやめる 読者になる 読者になる

第2回.Standard Shaderを使う

●はじめに

 今回はUnity5から導入された、Standard Shaderの使い方を解説していきます。


●Standard Shaderってなんですか?

 一言でいえば、何でも描ける万能のShaderです。
 Unity4以前は、DiffuseShaderやTransparentShaderなど大量のShaderがあり、Materialの設定時にそれぞれ適切なものを選択していました。
 Unity5からは物理ベースレンダリング(PBR:Physically Based Rendering)が導入され、一つのShaderで現実世界の様々な材質を表現できるようになりました。それがStandard Shaderです。
Unity4以前に使われていたShaderはLegacyShader(時代遅れのシェーダー)と分類され残ってはいるものの、基本的に使用しません。
f:id:IARIKE:20170225113443p:plain


●物理ベースレンダリング以前

 レガシーシェーダーが普通だった時代(XboxPS3,Xbox360中期までの頃)は、みんなが好き勝手に現実世界を表現しようと、表現したい要望に対して様々なテクニックを編み出していきました。たとえば…

  • プラスティックに光沢を入れたい => Specular Shader
  • クリーチャーの肌の凸凹を表現したい => Bumped Diffuse Shader
  • クルマの車体に周囲を映り込ませたい => Reflective Diffuse
  • ネオンを光らせたい => Self-Illumin Diffuse

 このように、表現したい一つ一つの項目に対して新しいShaderが作られていたのです。このやり方の問題は

  • 表現の項目が一つずつ追加されていくので、組み合わせの種類が膨大になること
  • Shaderによって表現する項目に一貫性が無いので、リアルではないこと。違うシーンで同じマテリアルを使いまわせないこと
  • Shaderに一貫性が無いのでシーン全体の雰囲気をまとめるのが難しい

などがあります。

レガシーシェーダーでは全体の雰囲気を合わせるのが難しく、一貫性のないバラバラな絵になりがち。画風の異なるイラストレーターがそれぞれ好き勝手に描いているような状態。


●物理ベースレンダリング

 レガシーシェーダーには上記のような問題があり、昔の記事を見ると結構みんなそれで困っているのがわかります。そこに救世主として登場したのが物理ベースレンダリングです。
 難しいことは言いません。一言でいえば

現実の物理現象を基準に、画風を統一しましょう!という考え方。現実世界は一つなので必ず統一されるし、物理現象を元にしているので結果リアリティも向上する。

 アニメ制作における作画監督のようなもの、と例えればよいでしょうか。それまで少し自由すぎたのです。


●マテリアルを作る

 小難しい話はこれくらいにして、実際に使ってみましょう。

  1. UnityのProjectウィンドウ(無ければメニューのWindow->Projectで表示)右側の好きな場所で右クリック
  2. 右クリック->Create->MaterialでMaterialが生成されます。
  3. 分かりやすい名前に変えます。ゆっくりダブルクリックするか、F2キーを押して入力状態に入り、"Plastic"と入力します。
  4. InspectorウィンドウにPlasticマテリアルが表示されていると思います。

f:id:IARIKE:20170225120925p:plain


●オブジェクトにマテリアルを割り当てる

  1. Hierarchyウィンドウを右クリックして、3D Object->Sphereを選択し球(Sphere)をシーン上に生成します
  2. Sphereを選択した状態では、InspectorウィンドウにSphereのプロパティが表示されます
  3. Mesh Rendererコンポーネントが開いてなければ、左の▽をクリックして開きます
  4. Materialsを開きます
  5. MaterialsのElement 0に、先ほど作成したPlasticマテリアルをProjectウィンドウからドラッグします
  6. 割り当てが完了しました

●Plasticマテリアルを調整する

  1. Sphereを選択し、Inspectorウィンドウに表示されていることを確認します
  2. Plasticのマテリアルボール(プレビュー表示)を探し、▽で開きます
  3. このプラスチックは不透明なので、Rendering ModeはOpaqueのままです
  4. Albedoのカラーパレットをクリックして、好きな色を設定してみましょう
  5. プラスチックは金属ではないので、Metallicは0にします
  6. Smoothnessを調整して表面の仕上げ(ざらざらツルツル)を自由に設定してみましょう
  7. マテリアルが完成しました

f:id:IARIKE:20170225124605p:plain

●パラメータ説明列挙

 このようにStandard Shaderには沢山パラメータがありますが、一つずつ説明します。
ただ列挙しただけなので、あまり真面目に読む必要はありません。

 まず一番上のRendering Modeですが、これは素材のタイプを選択します。

Rendering Mode 解説
Opaque 不透明な素材。最もよく使う。
Cutout 不透明だが、アルファ付きテクスチャで穴を開けられる素材。フェンスや木の葉など、ポリゴンで作るには大変な部分に用いる。
Fade 半透明な素材。同時に反射も透明になるので、物理的に正しくない。UIなど非現実的なものに用いる。
Transparent 半透明な素材。物理的に正しい反射をする。ガラスなどに用いる。

 次にMain Mapsの下にあるパラメータですが

Main Maps 解説
Albedo 素材の色(+透明度orスムースネス)を指定する
Metallic 素材の金属、非金属を指定する
Smoothness 素材表面の滑らかさ(つるつる、ざらざら)を指定する
NormalMap 法線マップを指定する
HeightMap 視差マッピング用の高さマップを指定する
Occlusion 遮蔽マップ(AO)を指定する。奥まったところや、傷などを暗くするのに用いる。
Detail Mask セカンダリマップの適用量をマスクで指定する。標準では全適用


Emission 解説
Emission(チェックボックス) 発光するかどうか指定する
Color 発光の色と強さを指定する
Global Illumination GIやライトマップベイクに影響する手法を選択する


Tiling テクスチャのタイリング(スケール)を指定する
Offset テクスチャのオフセットを指定する


Secondary Maps 解説
Detail Albedo 詳細(ズームアップ)な色を指定
Normal Map 詳細(ズームアップ)な法線を指定
Tiling テクスチャのタイリング(スケール)を指定する
Offset テクスチャのオフセットを指定する
UV Set セカンダリマップで使用するUVチャネルを指定する

●おわりに

 今回は物理ベースレンダリングやStandard Shaderの使い方を説明しました。
物理ベースレンダリングに関する詳細な資料は他にも沢山あるかと思いますが、実際使うだけなら

  • 「Albedoに陰影は描き込まない」
  • 「非金属ならMetallicは必ず0、金属なら1(途中の値は半分チリが積もっているとか、塗装が半分剥げている場合などに使用)」
  • 「Emissionは本当に光ってる物体に対してのみ使用する(明るさの調整に使わない)」

などの使用上のルールさえ覚えておけば問題ないかと思います。(守らないとリアリティに欠ける絵になります)