狠狠撸

狠狠撸Share a Scribd company logo
#3DCGMeetUp
リアルタイムレンダリングでのマテリアル表现
3DCG Meetup #14
kurosawa
#3DCGMeetUp
自己紹介
Name : Kurosawa
Twitter ID : kurosaurus
URL : the-saurus.net
アートディレクター/テクニカルアーティスト
#3DCGMeetUp
お題目
マテリアルを学ぼう。マテリアルを学べばこんなことができる。
? テクスチャだけではできない表現
? 実例紹介
? 様々な入力情報
? 計算式を加える
#3DCGMeetUp
テクスチャだけではできない表現
#3DCGMeetUp
マテリアルを学ぶとできること
? 画像の値を超えた表示ができる
? 解像度の限界を超えられる
? バリエーションを作れる
? ゲーム中に動かせる
#3DCGMeetUp
画像の値を超えた表示
いわゆるHDR(ハイダイナミックレンジ)の表示
画像はRGB(各チャンネルが0-255/0-1)
反射やブルームなどに影響するので、高輝度なものは高輝度に表示したい
#3DCGMeetUp
解像度の限界を超えられる
いわゆるディテールマップ
コントラストを高めるなどの工夫をすれば、
さらに解像度が目立たない表現ができる
#3DCGMeetUp
バリエーションを作れる
モデルとテクスチャは使い回してマテリアルのパラメータだけを変えると
軽量なデータサイズで作れる
#3DCGMeetUp
ゲーム中に動かせる
狭義での動くマテリアル
? 明滅する
? 眼球が僅かに揺れる
? 波の満ち引き
広義での動くマテリアル
? カメラに近づくと消えるマテリアル
? ビルボード(カメラの向きを無視して空間に固定)
? インテリアマップ
#3DCGMeetUp
※ インテリアマップはUE4だとマテリアルファンクションが用意されているので、
CubeTextureをつなぐだけで簡単に作れます
(余談)マテリアルファンクション
#3DCGMeetUp
事例紹介
#3DCGMeetUp
Plugs
プロ向け動画チュートリアルサービス
https://plugs.jp/
UE4シーン作成講座 for アーティスト
#3DCGMeetUp
眼球をわずかに揺らす
UVの値に時間をサイン波で変換したものを二種類混ぜ、UV値に加算する
#3DCGMeetUp
DistanceFeildAOで波を作る
DistanceToNearstSurfaceの値と、UVスクロールするノイズをいい感じに混ぜる
#3DCGMeetUp
パラメトリックなサビを作る
※ Plugs動画内では潜水艦の作成には触れていませんがサンプルファイルは付属します
高さ情報とAO画像とノイズを混ぜてコントラストを付け、マテリアルの閾値にする
#3DCGMeetUp
マテリアルノードをみてみよう
まずは赤い枠で囲ったところに注目
赤い枠の要素を足したり掛けたりしている
どんな入力情報があるか理解する
→ あとはそれらをうまく使うだけ
アーティストの得意分野の『創意工夫』
#3DCGMeetUp
注意:マテリアルで扱えるのは入力情報
マテリアルはいろんなものを拾ってこれるが、
マテリアルを持つピクセル以外を変えることはできない
(例外: Vertexシェーダーでマテリアルが割り当てられている
頂点を動かすことはできる)
#3DCGMeetUp
さまざまな入力情報
本当にたくさんあるので、使い勝手のいいものだけ紹介します
※ 今回はパーティクル系は割愛
#3DCGMeetUp
Constant
Constant (Scalar)
Constant2Vector
Constant3Vector
Constant4Vector
特定のチャンネル数の数値(定数)をつくる。
この数値はゲーム内では変更できない。
Scalar 1チャンネル
Vector 2-4チャンネル
※ 分かりやすくするため画面すべてのオブジェクトに
同じマテリアルを貼っています
#3DCGMeetUp
Parameter
ConstantとParameterの違い
Parameterはゲーム内で変更できる/Constantは変更できない
何でもかんでもParameterにすると管理が大変
ScalarParameter
VectorParameter
変更可能な数値(変数)をつくる。
ゲーム内で変更可能。
#3DCGMeetUp
ここまでの知識でできること
高輝度なマテリアル
画像だとRGBがそれぞれ(0-1)の間に収まる
ConstantやParameterなら高輝度にできる
#3DCGMeetUp
基本的な数式を覚えておこう
Add 加算
Subtract 減算
Multiply 乗算
Divide 除算
Saturate 0以下と1以上を切り捨て
ComponentMask 特定のチャンネルだけにする
Append チャンネルを追加する
#3DCGMeetUp
ComponentMask補足
ComponentMask 特定のチャンネルだけにする ≠ 赤や緑になる
Photoshopでいうチャンネル表示(チャンネルごとに0-1の値)
赤さの強度 どれくらい赤いか
#3DCGMeetUp
TextureSample
UVに沿って画像を貼る
そもそも画像を貼るということはどういうこと?
(あとで説明します)
#3DCGMeetUp
TextureCoordinate
UVチャンネルの設定
タイリング処理などUV関連の機能
2チャンネルのベクター【重要】
#3DCGMeetUp
ここまでの知識でできること
ディテールノーマル
TextureCoordinateを接続しただけのNormalに、
UVに掛け算をして接続したNormalを合成
Normalを合成するためのめんどくさい計算はBlendAngleCorrectNormalさんが勝手にやってくれるぞ!
(興味のある人はみてみよう)
#3DCGMeetUp
ObjectPositionWS
WS=ワールドスペース
オブジェクトごとのワールド空間の中心位置を出力
#3DCGMeetUp
WorldPosition
ワールド空間の現在のピクセル位置を出力
#3DCGMeetUp
ScreenPosition
スクリーン空間の位置を出力
#3DCGMeetUp
Vectorの話 グラデーションの正体
ComponentMask 選択したチャンネルだけに制限する
MaskでRのみの表示にすると横方向のグラデーション
#3DCGMeetUp
MaskでGのみの表示にすると縦方向のグラデーション
#3DCGMeetUp
画面の横度合いのグラデーション
画面の縦度合いのグラデーション
+ =
R
G
#3DCGMeetUp
チャンネルが少ないということ
Photoshopのここが少ない状態
(上から順番に詰める)
#3DCGMeetUp
クイズ
マニュピレーターの色ってどうやって決まっているかわかりますか?
これ
こたえ
RGB = XYZだから
コンピューターにとってはRGBもXYZも同じ
#3DCGMeetUp
WorldPositionのBチャンネルに使うと高さ方向のグラデーションになる
(例)WorldPositionのグラデーションをMaskしてみる
#3DCGMeetUp
TextureCoordinate+TextureSample
Vector
複数のチャンネルの数値(ここではUとV)
2チャンネルのVector
Vectorであれば
TextureCoordinateでなくともよい
#3DCGMeetUp
ここまでの知識でできること
プロジェクションマッピング
WorldPosition R(X) → U
WorldPosition G(Z) → V
TextureCoordinateの代わりの値を作る
#3DCGMeetUp
Time
時間を出力
→ 入力
出
力
Sine 正弦波に変換
※ 実际には明灭します
#3DCGMeetUp
TextureCoordinateにTimeの値を加算
ここまでの知識でできること
UVスクロール
※ 実際には模様が移動します
#3DCGMeetUp
CameraPositionWS
ワールド空間のカメラ位置を出力
※ カメラのX座標で明るさが変わります
#3DCGMeetUp
DistanceToNearstSurface
マテリアル内でDistanceFieldAOの値を取得
オブジェクトの設置をとれる
画像は[Show] > [Visualize] > [Distance Fields Ambient Occlusion]
#3DCGMeetUp
あらためてチャンネルとは?
色 RGBの3チャンネル
時間 どれだけ経過したかという1チャンネル
位置 XYZの3チャンネル
UV UとVの2チャンネル
#3DCGMeetUp
CGにおいてすごくたいせつなこと
「色も時間も位置もUVも画像もみんなおなじ」
(いくつかのチャンネルの値でしかない)
コンピューターにとってはRGBもXZYも同じもの(3チャンネルのVector)
マニュピレータの色はXZYにRGBに相当することを示している
#3DCGMeetUp
計算式を加える
#3DCGMeetUp
グラデーションをシャープにする
#3DCGMeetUp
球を描く
中心の位置から半径の値を引く
(WorldPositionは塗りつぶす対象として必要)
#3DCGMeetUp
球と円の違い
円とは
Z軸(高さ方向)の値を持たない球
カメラと球の中心位置からBチャンネル(この場合はZ)をMask
#3DCGMeetUp
カメラ座標を使ってみる
球を描く式の中心の座標の代わりにカメラの座標を使ってみる
近づくと穴が開く仕組みができる
#3DCGMeetUp
球を多重にしてみる
#3DCGMeetUp
グラデーションの波形変換
正弦波
Sine(-1~1)
ノコギリ波
Fmod
矩形波(っぽいもの)
Sineに大きな値をかけてSaturateとか
キレイな正弦波や矩形波を作るマテリアルファンクション
#3DCGMeetUp
円を描くもう一つの方法
VectorToRadiusVaueで極座標変換できるのでこれでも円は描けます
(これもマテリアルファンクション)
#3DCGMeetUp
螺旋を作る
時計回りのグラデーションを利用して螺旋にしてみました
#3DCGMeetUp
画像でトーンマッピング
TextureSample = チャンネルを画像ベースで再マッピングと解釈
#3DCGMeetUp
画像で動かす
#3DCGMeetUp
画像でUVをゆがめる
左側のテクスチャで右側のテクスチャが歪む
#3DCGMeetUp
UVにテクスチャをマッピングするということ
0 1
1
0
UV空間に画像をマッピング
↓
2Vectorと3Vector ? 别の3痴别肠迟辞谤
#3DCGMeetUp
TextureSampleのほんとうの意味
TextureSample
UVに対して画像を貼るノード
TextureSample
2Vectorと3Vectorを使い、别の3痴别肠迟辞谤をつくる
InputはUVでなくとも構わないし、
出力は画像でなくとも構わない
#3DCGMeetUp
画像を画像以外のものとして扱う
(もしかしてすごく特殊な話をしているように聞こえたかも…?)
でも、本質的にはこんにちのゲーム開発ではアタリマエ
よく使われる例
NormalMap
TangetNormalの変位情報
VAT(Vertex Animation Texture)
時間経過でピクセルの頂点がどう移動するかという情報
画像出典
http://houdini.indyzone.jp/blog/vertex-animation-texture-について/
#3DCGMeetUp
CGにおいてすごくたいせつなこと
「色も時間も位置もUVも画像もみんなおなじ」
画像を移動情報に使ってもよいし、オブジェクトの位置をカラーにしてもよい
UVの代わりにワールド空間を使ってもよいし、時間を使ってもよい
頂点座標を時間から作ってもよいし、色をUVから求めてもよい
#3DCGMeetUp
もっと自由なCG制作を楽しもう!

More Related Content

リアルタイムレンダリングでのマテリアル表现

Editor's Notes

  • #3: 今回、登壇の話を出したら、会社名を出すなら旅費や宿泊費が半額出ると言われたのでー 学ぶ機会には積極な会社 アート職も積極的に募集中 TA,アートディレクター、モデラー 興味がある人は後で声をかけて下さい
  • #6: テクスチャを貼っただけで終わりになっていませんか? マテリアルを学ぶと
  • #10: 服が水に濡れて色が暗くなったり、风で服の裾がはためいたり、マントとか
  • #13: めんたいこさんが開始したサービス 今日の公演ではPlugsの内容をそのままやるわけではない でも本質的な部分を理解すれば、同じことができるはず 公演を見てUE4のマテリアルをもっと学びたいとおもったら買ってね! 登壇者も募集してるそうなので、興味がある人は懇親会で声をかけてみてもいいかも
  • #16: コントラストを付けることでノイズテクスチャの解像度をよりわかりにくくしている
  • #17: 入力情報 とってくることしかできない マテリアルの大前提
  • #20: チャンネル数 数字の数 1チャンネルだとグレースケール、3ちゃんねるでカラー、4ちゃんねるでカラーとアルファ Photoshopだと0-255というが、マテリアルでは0-1でいうことがおおい わかりやすくするために選択しているため、輪郭線が出ています(実際には出ません) 今後も輪郭線が出ていることがありますが、基本的に無視してください この画像とか、以下に出てくる画像はすべて全部同じマテリアルを貼っている
  • #21: (今の时代は负荷はそこまで気にしなくてもいい)
  • #22: 贬顿搁滨画像は0-1に収まらないけど、データサイズはかなり大きいので気軽に使えない
  • #23: 四則演算は説明いらないよね? Saturateはわかりにくいけど、先程のParameterのあとにつなぐと1になる ComponentMaskはカラー画像だとRだけを取り出したりGだけを取り出したり といってもPhotoshopで言うところの緑(0,255,0)になるのではなく チャンネルそのものが減る 緑成分だけのスカラー値になるイメージ
  • #25: 単に鲍痴に沿って画像を贴ることに使うことが多いが、たぶんそこは本质的な理解ではない
  • #26: 2チャンネルのVector Webドキュメントにもそう書いてる UとVだから2つのチャンネルのVectorだという当たり前の話でもあるが、 本公演の重要なテーマなので貼っておく
  • #27: マテリアルファンクション マテリアルの機能の一部を関数化して使い回す仕組み マテリアルだと関数=機能とでも覚えておいてもよい
  • #28: 見た目をわかりゃすくするためにちょっとだけ数式をくわえています Divid 割り算 1024という数値はさっきでたconstant UE4は単位系がcmなので ObjectPositionWSで出てくる値は数千とか大きな値 なぜこんなカラフルな画像なのかはあとで説明
  • #29: 先程の画像と似ている 先程はオブジェクトごとの中心座標だが、こちらはピクセルごとの座標
  • #30: わかりにくいのでオブジェクトを選択している UIなど画面上で一定の場所に出るものに便利 また変なグラデーションがでてきた UE4を使用しているとこんなグラデーションを何度もみることになる このグラデーションが一見わかりにくい
  • #31: ノードではMask(XX)とだけ表示 MaskをRだけを表示してみると横方向のグラデーションであることがわかる Gは縦方向のグラデーション
  • #32: Gにすると縦方向のグラデーション つまり、横方向のグラデーションはRで描かれ、縦方向のグラデーションはGで描かれる
  • #33: このよくわからないグラデーションは 赤い成分のグラデーション+緑成分のグラデーションです 赤成分 左黒い 緑成分 上黒い どっちの黒いので左上が黒い どっちも白いので、右下が赤+緑で黄色
  • #35: あとでもう少し詳しく説明しますが、 コンピューターにとってはRGBもXYZも同じこと すごく大事なこと
  • #36: ScreenPositionにMaskしたようにWorldPositionのBチャンネルをマスクしてみます。 すると高さ方向のグラデーションになる ここでちょっとマニュピレーターに注目 矢印の縦方向が青だ
  • #37: テクスチャをつないでいるだけのこれ これってつまりどういうこと? 0番のUVでマテリアルを貼りますよという意味、UVを貼るとはどういうこと? TextureCoordinateには2チャンネルのベクターが入っているということに注目
  • #38: 上から投影マッピングしたように见える
  • #39: Timeからくる値はゲームの開始時間ともにどんどん増えていく 簡単に1以上の値になるので少し処理を入れている Sine -1~1の正弦波に変換して出力 さっきと同じような計算だけど、目に優しいように0.25~0.75の間で出力。 めっちゃチカチカする
  • #40: TextureCoordinateはUとVの2つのチャンネルだが、timeは一つのチャンネル、こういう足し算の場合はUとVそれぞれに足すことになる UとV、それぞれが動くので斜めにスクロール モデルのUVを動かしているのではない ピクセル側からずれている
  • #41: カメラの位置なのでカメラを動かすと値が変化する この計算の意味 カメラの座標はとても大きな数値なので、1000くらいで割っている その後、MaskGで緑の成分(座標でいうとY)だけ表示している
  • #42: ほかにオブジェクト同士の設置をみれるのはDepthFadeとか ただしこちらはデプスバッファをつかう つまり半透明だけ
  • #43: ここまで见てた中で元がどんな値でもチャンネルとして自由に使っていることに気がついたはず…
  • #44: コンピューターを使っている以上、当たり前といえば当たり前 色も時間も位置もUVもテクスチャもただの値にすぎない 最初のマニュピレーターの話に戻ってみる このあとはそれらを応用して何ができるか、いくつか例を示す
  • #46: 0.5を引いた後にシャープにするための数値をかける。その後0.5を足す コントラストを作る中心位置を0.5にするために行う計算 Saturateで1以上をカット これもシャープにするためによくやる計算
  • #47: 以外に感じるかもですが、 二点間のグラデーションを作るよりも、球のほうが簡単だったりします。 Distance 距離をだす
  • #50: 実は先ほどの球を描く方法では非常にシャープな球を描いているようにみえるが、0-100000という非常に大きな数値がきている Saturateで1以上の値を1にしているだけ 1-x 反転する Fmod 余りを求める 余りを求める のは非常によく使うテクニック 0-10までの数値があるとする 3で割った余りを求めると、値は0,1,2 0,1,2 0,1,2 0,1 になる つまり繰り返すことになる
  • #52: 赤い部分が円のグラデーションのようになっているのがわかる 小さな円に見えるが、この範囲よりも大きなものが1よりも大きな値で広がっている サチュレートしているからみえないだけ 極座標変換のマテリアルファンクションはUV空間に落としこまれているので、2チャンネルのベクトルになってる なので球にはならない 極座標で作るメリットはもう一つあって、Gチャンネルが時計回りのグラデーションを作り出す。こちらを使って面白いマテリアルを
  • #53: Fracは1で割ったFModと同じ 時計回りのグラデーションに1を足して(ずらして)加算する。 その値に時間を加工したデータを足して動かす。 サインで一定周期の模様に変える(FMODでやった処理と同じようなこと)
  • #54: TextureSample UVをベースに画像を貼る機能だけでなく より広義に解釈 UV(0-1)空間で入ってきたものを画像ベースの再マッピング
  • #56: もう少し複雑になった例 時間ベースで同じ感覚で流れてくる値
  • #59: 画像を画像以外のものとして、 単なる情報として扱うというのはもはやアタリマエの世界にいます
  • #60: コンピューターを使っている以上、当たり前といえば当たり前 色も時間も位置もUVもテクスチャもただの値にすぎない