はじめに
今回はこちらを見ていきます
8. マテリアル
Intro and Philosophy
- すべてのツールと処理は見えているべき
- 他の多くのツールと同様見た目と結果が同じようになる必要がある(WYSISYG)(What You see is what you get)
- プロジェクトの最後のレンダリングプロセス100%同一になる必要がある
- 基本的にゲームで見るものはエディターで見るもの
UE1
- テクスチャはジオメトリに直接適用していた
- 128/256解像度の8ビット
- メモリが 32MB、64MBなどの頃の話
- 手続き型テクスチャエフェクトツールがあった
- 水滴、炎、マジック、など
- この頃からすでにツールに重きをおいたアプローチを取っていた
UE2
- テクスチャが任意でシェーダーの一部となることもできた
- 一種のマテリアルが導入された
- 利用可能な異なるスロットにテクスチャやブレンディングオプションを設定するような使い方だった
- 2ペアのシェーダーが可能だった。つまりシェーダー内シェーダーがあった
UE3
- UE3で非常に進化し、基本的にはUE4と同様になる
- 完全なグラフベース(ノードベース)のマテリアルエディターで多くの式が認識可能
- ノーマルマップなど
- インスタンスのサポート
- 今日のレガシーなコアのツールセットとなっている
UE4
- 追加の式と事前に作成された関数。例: ノイズ
- パラメータコレクションとレイヤーが追加
- マルチプラットフォームサポートがより良くなった
- UIと使い勝手の改善
全体図 概要
- これはシェーダー言語の下にあるすべてのもの
- マテリアルノードと式がある
- 上記がマテリアルエディターに渡される
- マテリアルエディタではテクスチャが使用可能
- マテリアルエディターサポート機能もある
- Material Function
- Material Layers
- Material Param Collections
- Material Instances
- 上記はサポートしたりコラボレーションを向上したりする
- マテリアルはコンパイルされる必要がある
- コンパイル後レンダリングされる
- テクスチャとレンダリングのためのスケーラビリティ機能がある7
- 長い年月をかけた進化し単にマテリアルをグラフエディターを使って書くだけではなくなりました。
- エンジンのあらゆる部分と綿密に結合された成熟されたシステム
- 何年もかけた結果グラフネットワークアプローチの課題が明確になりました
- スケールでの持続可能性、そしてコラボレーションは、過去14年以上にわたって私たちの焦点となってきたものです。
- 数千のマテリアルやインスタンスが必要
- Material Instances、Param Collections、Functions、Layersなどの機能が必要です
- クオリティスイッチ、プラットフォームセッティング、状態が必要でスケーラブルである必要があります
- クロスコンパイルも可能である必要があった
スキマティック
USF HLSL Files (Unreal shader file)
- シェーダ言語であるHLSLを使用
- windows10のデフォルトインストール箇所:
C:Program FilesEpic GamesUE_4.25EngineShadersPrivate
C:Program FilesEpic GamesUE_4.25EngineShadersPublic
- テキストエディターで開くことができ、内容はシェーダー言語で書かれたソースフィアル
- テンプレートとして機能しMaterial Editorに向かう
Material Editor
マテリアルは本質的には、マテリアル設定で設定した大きなマテリアルノードとユーザーがビルドする式の組み合わせで、それを足したものが出力される
Shading Model
- ライトを受けないようにしたりできる
- シェーディング モデルは、最終的な結果を生み出すために入力がどのように使用されるかを決定する。
Blend Mode
- 不透明、透過処理、マスクなどのブレンド方法
Material Domain マテリアルドメイン
- 全体図右端に配置しているもの
- マテリアル ドメインは、マテリアルがどのように使用されるかを指定する。
- マテリアルの行き先
- Decal
- Post Processing
- Volumetric
All Other Settings
– 赤枠の部分でShader Mode等すでに上で解説のあったもの以外のすべて
– 個々の設定でシェーダー言語のテンプレートのどれを使うかなどが決定する
- 最終的にマテリアルをグラフエディターで構成しなければならない(上図)
- しかしどの項目が活性化しているかを設定しているのが1個前の図の赤枠の部分
Material Node
利用可能な入力は、マテリアルの構成とそのオリジナルのHLSLコードに依存します。
Expression Workspace
- 2つのパートに分けられる
- 左側の式
- 右側のマテリアルノード
Expressions
- 数十の式が使える
- 作業の大部分を占める
- 式のリスト。使うのはだいたい5%~10%程度
Textures
- デフォルトだとマテリアルごとに16のテクスチャが使用可能
- この内13個程度は自由に使用可能。残りはライトマップ、シャドウマップなどに使用される
- テクスチャからマテリアルをどう読むか
- テクスチャストリーミングと仮想テクスチャ
- 圧縮と派生データキャッシュ
Texture Streaming
- ずっと前からゲームにある
- Textureはストリーミングされる事が可能でVT(Virtual Texture)にレンダリングされる事も可能
StreamingPool
- Texture Streamingに割り当てるメモリの量を制御する
- パワーの小さいPCでは少なくする事をおすすめ
- コンソールから設定可能:
r.Streaming.PoolSize
- 1GB に設定されていた(開いていたAction RPG の設定?)
Streaming Virtual Texturing ストリーミング仮想テクスチャリング
- Textureはストリーミングされる事が可能でVT(Virtual Texture)にレンダリングされる事も可能
- 非常に高解像度なテクスチャを処理する機能
- 巨大なテクスチャ全体をストリーミングするのではなくレイヤー間で仮想テクスチャリングを行うことで必要なパーツのみがストリーミングされる
- 便利だが多くの処理能力を必要とする
Texture Properties
- テクスチャをカテゴライズし一括編集や制御ができるようにする
- 輝度やコントラスト様々なものが変更可能
Texture Groups
- テクスチャをカテゴライズし一括編集や制御ができるようにする
- 30~20の異なるカテゴリにテクスチャをグループする機能
- デフォルトでは全て Worldまたは World NormalMap(法線マップ) に設定されている
- World NormalMap の場合はUnrealで検出される
- 他にも多くのカテゴリがあり、これらを設定するのは重要
- デフォルトではカテゴライズしても何もしない
- 後でカテゴリXのすべてのテクスチャを解像度2048以下にする。といったことができる
- またはコンソール x カテゴリx ⇒ 解像度 2048以下の様な条件にも使える
- UIというカテゴリは特別なカテゴリの一つ
- これに設定するとプロパティの一部が変更される
- ミップマップはなくなる
- ストリーミングを行われなくなる
Import
TGAはアルファ層をサポートしているため一般的に標準フォーマットです
Compression 圧縮
- プラットフォームごとに異なった圧縮をサポート
- MaskやGrayscaleなどが設定可能
- MaskやGrayScaleは圧縮が解除されるため軽くならない
- 変更後のサイズも確認可能(上図)
Derived Data Cache 派生データキャッシュ
- クックされパックされるまで圧縮されたテクスチャを持つ。
Shared DDC
- DDCはサーバーによって共有され得る
Workflow and collaboration tools
- マテリアルの使用を加速させる
- 多くはワークフローとコラボレーションの改善を目的としている
Material Function
- Expression の組み合わせに過ぎない
- 例: FOV 視野角
- FOVをダブルクリックすると
- 式を組み合わせた小さなグループが表示される
- このグループはマテリアルの外に存在しているためプロジェクト全体でも使用できる
- マテリアル以外に使用する用途があるのかな?
- FOVをダブルクリックすると
Material Layers
- 関数の一種だが大きいグループまたはマテリアル全体のグループを指す
- Outputを一つする設定。Layerとは後でブレンドしやすくする事を指すのか?このオプションの解説を行っていた
Advanced Material Layers
- 新しい機能でLayerのパワーアップバージョン
- UIとワークフローが改善されている
- 将来には現存のMaterial Layerと入れ替わる可能性がある
- あらゆるものに挿入でき、グラフに構築するよりも円滑にレイヤーをスタックできる
Parameter Collections
- パラメータのスーパータイプで、1つでマテリアルをまたがって存在させる事ができる
- あまり使用されるわけではない
- マテリアルの値をBPなど外側からアクセスしたい場合パラメータとする必要がある
- 定数ノードを配置し右クリックしたところ
- これを行うことによる問題点
- 例えば50個の異なるパラメータがありすべて変えたい時面倒な作業に成る
- 50回の変更作業が必要になるため
- 例えば50個の異なるパラメータがありすべて変えたい時面倒な作業に成る
- 一つの変数で広域に適用できる場合に使用している(講師談)
- 例草原。地面も緑、草も緑でこの色をパラメータにしているため、この色を変更すると草原全体が変わる
- 例風。草や木、髪の毛などいろいろなものに影響を与えたい場合に有用
- 可視性はグローバル
Material Instances (system)
- 少し毛色の違うもので非常に重要な部分
- こちらはコンパイル後に使用される
- BP、C++、Sequencerといったものからでもマテリアルを変更可能とするもの
- マテリアルを修正するためにはインスタンスが必要
- 理由は2つある
- 機能的な理由と
- ワークフローの観点からの理由
- 理由は2つある
- マテリアルからインスタンスを取り出す
- 利用例
- 色の違うドアが作りたくなった場合、マテリアルをコピーするのではなくドアの色を含めた一部をパラメータ化する
- 次にマテリアルインスタンスを作成
- 開くと右側にはパラメータ化したものだけが表示されそれは修正可能
- インスタンスをインスタンスの一部とする事も可能
Compilation コンパイル
Shader Permutations
- Compilation での注意点が1つ。
- Compilationではシェーダーパーミュテーションが行われている
- それはプラットフォームまたはレンダリング設定のため
- コンパイル後にプロジェクトを開始すると1万5千のマテリアルをコンパイルしていると表示される事があり、実際にはそんなにないと思うことがある
- それはシェーダーパーミュテーションが行われている為表示されている
- UEでは常に最適化されたマテリアルを作成しようとする
Switches
コンパイラにインジェクトしシェーダーパーミュテーションを生成する
Platform/Render Settings
コンパイラにインジェクトしシェーダーパーミュテーションを生成する
Usage Flags 使用フラグ
- コンパイラにインジェクトしシェーダーパーミュテーションを生成する
- ここを見ればなぜパーミュテーションが必要なのか分かる
Materials Applied
UI
- UIにもマテリアルが適用できる
Decal
- deferred decalsに使用されるマテリアル
- どのようにブレンドするか
Post Processing 後処理
後処理のところでインジェクトされたマテリアル。レンダーイメージを変えることができる
Volumetric
- ボリュームのある霧を作成するのに使われるマテリアル
Light Function
- ライト関数
Surface
- メッシュと面のようなものに使われるマテリアル
- 標準的なマテリアル
Runtime virtual texture
- ランタイムに生成
- Serverパフォーマンス、メモリコストがかかる
- テクスチャとワールドを仮想テクスチャにサンプリングする
- 具体的な例としては岩があり、岩を景色にブレンドしたいとする
- ランタイム仮想テクスチャを使用して岩を景色にブレンドできる
- 岩は周りの地面を検出し情報をサンプリングしレンダリングする
Shipping Project
- ターゲットプラットフォームに内容をクックする
- ノート: エンジンは可能な限り効率化しようとする
- そのためシェーダーパーミュテーションの一部として未使用のシェーダーはパッケージ化の時点で除外される
- これが最も明らかになるのはエディタ
Performance
- レンダリングされたマテリアルの性能影響の評価
Material Stats マテリアル統計機能
- Statsでは数々の命令が見える
- 命令数、テクスチャサンプル数などが確認可能
Platform Stats プラットフォーム統計
- プラットフォーム別の追加詳細はここで確認可能
- Statsとほぼ同じだがアプローチが異なる
- 異なるプラットフォームでどう見えるかを示してくれる
- 上記からプラットフォームの切り替えが可能
Shader Complexity シェーダ複雑度
- 1ピクセルあたりのシェーダコストの近似値はこちらで確認可能
- 命令数の可視化の模様
- 上記の図の赤い部分は炎であったり草であり微妙に動き続けている部分
- VSはVertex shader、 PS はPixel Shaderの意味
- これスゴ…
Quality/Feature Switches
- Switchesの特殊バージョンであるプラットフォーム上やセッティング上で機能の一部を無効化する
r.MaterialQualityLevel
コマンドによって設定を確認する事もできる
Material Analyzer
- Switchesの特殊バージョンであるプラットフォーム上やセッティング上で機能の一部を無効化する
- 講師は個人的にはあまり使わない機能とのこと
- 最近の機能
- 表示方法
- マテリアルを選択して確認
Custom
- 通常特殊ケースで使用
- カスタムな式はHLSLがマテリアルエディターに入る量を制限する事ができる
アドバイス
Balance Materials/Instances
- すべてを固有のマテリアルで構築するのは困難
- すべてが固有のため反復が困難になる為
- より多くのシェーダーを作成することになる
- すべてをインスタンスにする場合もやはり困難になる
- 特定のインスタンスを変更して異なる動作にしたい場合があるため
- その場合親マテリアルであるマスターマテリアルを変更する必要がある
- 境界線は微妙で明確な定義はない
- プロジェクトごとにケースバイケース
- プロジェクトのサイズがわからない内に決め打ちしてマテリアルを少数にするのも困難になる
- 上記は理論的な例
- 上記はレイヤーを含む理論的な例
Instances Within Instances インスタンスの中にインスタンス
Shader Compile Distribution
- Incredibuildを使用するとシェーダーコンパイル時間に大きな違いが生まれます
- 大きなプロジェクトでは1つのプロジェクトで10万個以上のシェーダーを使用できますが時間がかかります
- Incredibuildはシェーダーのコンパイルを分散することでその時間を短縮できます
Compression/Mergemaps
- マージマップ(講師の呼び方)、チャネルパッキングなどどのような呼び方でもいい
- 複数のグレースケールテクスチャを1つに統合することを指す
- テクスチャのサンプル数とメモリーオーバーヘッドを軽減
- これならテクスチャの保存にアルファを使用する必要がない。通常UEのアルファは圧縮されない
- Compress Without Alphaにするとサイズが2M以上減っている事がわかる
- 動画でも20MB以上のテクスチャが半分以下のサイズとなってた
PBR Tips
- SpecularとMetallieは通常単一値です
- 上記にはテクスチャを割り当てません
- Roughnessは最も重要。ここでテクスチャを生成するべきです
- テクスチャは単純なマテリアルや遠距離のジオメトリには十分でメモリ節約にもなる
- いくからの SpecularとRoughnessが確認できる
- これが例として挙げられていたけど何か良いことがあるのだろうか?
- Texture Sample のRを Lerpの値に使ってRoughnessを上げたり下げたりしている模様
- 夕焼けになるとラフネスが変わるということですかねぇ。。。
- いくからの SpecularとRoughnessが確認できる
- AOは静的ライティングのみに有効で動的ライティングには機能しない
Function Libraries
- 講師の方はいつも新しいプロジェクトで自分の勘数を作りそれを基礎としている
- 他のすべてのマテリアルは上記の基礎の上に構築する
- 独自のを持っているとカスタマイズも直ぐにできるしいいですよという内容
- エンジンは関数ライブラリの標準セットを持っている
Preparing for Scalability スケーラビリティに備える
- Textureグループとクオリティスイッチは1日目から考慮してください
- 他のマテリアルフラグの有用さに気づいてください
- ある式はより高負荷です
最後に
ふぅ~長かったキックスタートが終わった。今頭の中には薄い膜ができている感じですね。
まだまだ断片的ですけど、これから経験する事によって接続されていきもとの全体図が頭の中で構築されて行くことを願っています。
しかし、キックスタートのワールドビルディングから初めてマテリアルまで8回ビデオでしたが、まとめた粒度はあとのほうが濃ゆい。いつかまとめ直したいですね。
メモ
- グラフベース = ノードベース
- コンソールコマンドの
r.Streaming.PoolSize
の先頭の r はrenderの意味 r.MaterialQualityLevel
でクロリティーレベルが確認できる- VT = Virtual Texturing
- decal = 写し絵