もんしょの巣穴blog

[UE4] Deferred Decal

ぷちコン応募作品製作のためブログの更新が滞ると思いますが、何かネタがあったら更新するかもしれません。
気長にお待ちください。

さて、今回紹介するのはUE4のDeferred Decalです。
Decalというのは元はデカルコマニーと呼ばれる転写技術のことだそうです。
日本人男子ならガンプラのデカールを思い浮かべるかもしれませんね。
UE4に限りませんが、ゲームのグラフィクス技術でデカールというと、弾痕、血痕といったものをステージモデルやアクターモデルなんかに貼りつける技術を指します。
初代『Halo』の日本発売時CMでは、壁に弾痕で"X"を書くということをしていましたが、ここで使用されているのがデカールです。

デカールは基本的に、ある一定範囲内に任意の方向からテクスチャを投影する、という手法をとります。
ただし、実装方法はいくつか存在しています。
昔、PS2のあるゲームで足跡を実装したときは、コリジョンモデルに対して投影するテクスチャを四角柱上に投影し、コリジョンモデルのポリゴンを分割して足跡モデルとして描画したことがあります。
また、デカールを貼りつけるモデルを、貼りつけられるデカール分だけ描画する、なんて方法もあります。
前者はコリジョンが描画モデルと同一でなければ浮いたり埋まったりしてしまいますし、後者はほんの一部の描画のためにモデル全体を描画するのは速度面で問題が出てきます。
前者はコリジョンモデルでなく描画モデルで実装すれば埋まったりする問題に対応できますが、描画モデルのポリゴン数によっては負荷が高くなってしまいます。

で、最近のゲームやUE4ではどうしているかというと、すでに描画されている深度バッファを利用して描画済みカラーバッファやGBufferに対してスクリーン空間で張り付けるような手法をとっているものが多いようです。
UE4はGBufferに対して貼りつけており、それゆえに"Deferred Decal"と呼ばれているようです。
シェーダコードを読むと、これでいいのか?と思う部分もありますが、まあうまくいってるっぽいのでいいか。

では、続きから使い方の解説です。
まあ、難しいことはほとんどないですが。


[[UE4] Deferred Decal]の続きを読む
スポンサーサイト
  1. 2014/08/23(土) 22:19:23|
  2. UE4
  3. | トラックバック:0
  4. | コメント:0

[UE4] CustomDepthを使ってみる

今回は主にポストプロセスで利用するCustomDepthについて解説し、簡単なサンプルを作成してみました。
ついでに、みんな知ってると思いきや意外と理解されてない深度バッファについても簡単に解説しようと思います。
深度バッファくらい知ってるよ、って人は多いと思うのですが、開発者の中でも知らない、正確に理解してない人が意外といます。
たいてい問題になるのは半透明関連なのですが、その際に、こんな風になるんだけどなんで?とか言われて、また説明しなきゃいけないのか?どうやって説明したら納得してくれる?と頭を抱えることが結構あります。
なので、不要な気もするけど説明しようかと考えた次第です。

では、深度バッファについて最初に解説しましょう。
深度バッファはカラーを描画するフレームバッファと同じ大きさのバッファで、各ピクセルのスクリーンに対する奥行きを保存しておくバッファです。
これを保存しておく主な理由は遮蔽されているポリゴンを描画しないようにするためです。

下の図は2枚のポリゴンがスクリーンに表示されている状態ですが、赤と緑のどちらが手前に存在するポリゴンでしょうか?

ue164.jpg

左であれば赤が、右であれば緑が手前側のポリゴンと判断されるはずです。
ここまではいいですよね?

このような状態を正しく処理する方法として、ポリゴンを奥から順番に描画するという方法があります。
しかし、その方法ではポリゴンとポリゴンが突き抜けている状態は表現できません。

そこで出てくるのが深度バッファです。
深度バッファには各ピクセルごとの深度を0.0~1.0に変換した値が格納されます。
格納されるのはカラーピクセルが描画されるときだけで、カラーピクセルが書き込まれない場合は深度バッファも同様に書き込まれないのが基本です。
カラーピクセルが描画されない場合というのが深度バッファによる遮蔽カリングが動作した場合です。
つまり、すでに書き込まれている深度バッファの値が新しい深度の値よりも小さい(手前側にある)、と判断された場合です。

上図の左側のような状態を、赤→緑と描画された場合を例に処理の流れを追ってみます。

 1.深度バッファは最大値(1.0)ですべて初期化される
 2.赤ポリゴンが描画され、このポリゴンの各深度値は1.0より小さい、つまり一番奥より手前にあるのですべて描画される
 3.緑ポリゴンが描画された場合、赤ポリゴンとオーバーラップしていない部分は普通に描画される(赤ポリゴンと同じ理由)
 4.オーバーラップしている部分は緑ポリゴンの深度値とすでに書き込まれている深度値(=赤ポリゴンの深度値)と比較され、赤ポリゴンより奥にあると判断されるので描画されない

と、こんな感じの流れになります。

不透明描画の場合はこの処理の流れで何も問題なかったりするのですが、半透明の場合はまたちょっと特殊です。
ただ、UE4を改造せずに使っている限り、この辺の問題は何も気にしなくてOKです。
もしも修正が行われてこの辺の設定が細かくできるようになったら、その際に別の記事を作成しようと思います。

ここでGPUの話。
深度バッファの機能は結構昔から存在しますが、そのころからあまり機能的な拡張は行われていません。
先の説明では深度バッファの比較、書き込みが不透明の際には常に行われている、という話になっていましたが、実際のGPUではこの辺の設定はそれなりに細かく行えるようになっています。
少なくとも以下の3点は現在のGPUならほぼどれでも設定が可能です。

 1.深度バッファとの比較を行うか否か
 2.深度バッファへの書き込みを行うか否か
 3.比較を行う際の比較関数

1については深度バッファ全体をDisableにする方法が最も一般的です。
この場合は比較も書き込みも行われなくなるので、比較はしないけど書き込みたい、というかなり特殊な事例(どういう状況か想像もつかないけど)の場合は2と3を併用する必要があります。

2はUE4の半透明オブジェクトがこの機能を利用して常に書き込まないようになっています。
ただ、個人的には書き込みを可能にする機能を追加してほしいとは思います。

3は比較する際の比較方法です。
設定項目は決められた方法の中から選択するしかありませんが、>、<=、==などの他に、必ず描画する、必ず棄却するなどの設定もあります。
これらは特殊な描画方法で使用されることはありますが、UE4では設定が不可能になっています。

UE4では半透明オブジェクトに関して1の設定は行うことが可能だったりします。
マテリアルのDetailsタブの[Translucency] -> [Disable Depth Test] をONにすると深度の比較を行わずに常にピクセルが描画される状態になります(ただし、深度バッファは書き込まれない)。
ただ、[Enable Separate Translucency] がONの場合はなぜか一切描画されなくなるので注意してください。

ue165.jpg

[Disable Depth Test] がON/OFFの場合は以下のような結果になります。

ue166.jpg

OFFの場合はきちんと手前のオブジェクトで遮蔽されていますが、ONの場合は遮蔽されなくなっています。
静止画だと配置している位置が違うだけにも見えますが、動かしてみるとかなり気持ち悪いです。
特にOculusなどの立体視ではこの設定はできるだけ使わないようにしましょう。

深度バッファの簡単?な解説はここまでにして、本題のCustomDepthについて続きから解説します。

[[UE4] CustomDepthを使ってみる]の続きを読む
  1. 2014/08/17(日) 01:12:45|
  2. UE4
  3. | トラックバック:0
  4. | コメント:3

[UE4] 半透明マテリアル

今回はUE4での半透明マテリアルの特徴について記事にしてみます。
最初に結論を言ってしまうのであれば、現在の半透明マテリアルについては”期待するな”。
PS2の頃から開発をしているデザイナさんなどは半透明でいろいろな表現をしようと思うかもしれませんが、考え方を変えないとUE4での美しい映像表現は難しくなります。
Deferred Shadingの知識を持っている方であれば、半透明オブジェクトと不透明オブジェクトが同等には扱えないことを理解してもらえると思いますが、そのあたりも含めて解説していきます。
不明な点等ありましたら質問していただければ答えられる部分には答えますので、よろしくお願いします。

さて、UE4で実装されているDeferred Shadingと半透明マテリアルの問題点を簡単ながら解説していきます。
以前にも解説しましたが、UE3まではForward Renderingという技法が採用されていました。
これは3Dゲーム開発の現場では慣れ親しんだ手法で、"モデルを描画するパス"=="ライティングパス"という技法です。
モデルが描画されると、その段階でライティングが行われた結果がフレームバッファに描画される、というわけです。
Deferred Shadingと呼ばれる技法はこれとは違い、"モデルを描画するパス"=="GBufferに書き込むパス"であり、"ライティングパス"とは!=の関係にあります。
GBufferはライティングに必要な情報を保持する複数のバッファであり、ここに情報を書き込む段階ではライティングされた結果、つまり、最終的な映像は作成されていないということになります。

ここで半透明マテリアルについて考えてみます。
半透明マテリアルはアルファブレンディング、加算合成などいくつかの合成方法はありますが、ほぼどれでも共通している部分として、すでにバッファに書かれている情報を合成計算に利用する、というものがあります。
例えばアルファブレンディングの計算式を見てましょう。

 FinalColor = SrcColor * Alpha + DestColor * (1 - Alpha)

この計算式において、FinalColorは合成結果、SrcColorが書き込むカラー(つまり半透明マテリアルのカラー)、DestColorがフレームバッファのカラー、Alphaが不透明度となります。
不透明度が1.0、すなわち完全な不透明のマテリアルであればFinalColorはSrcColorと一致します。
この計算式からもわかるように、半透明マテリアルを利用する場合はDestColorがわかっている必要があり、そのためには半透明マテリアルより奥にある物体はライティング計算が行われた、最終的な出力カラーが求められている必要があるわけです。

Forward Renderingのエンジンにおいても、半透明マテリアルは結構悩みの種ではありました。
しかし、最初に不透明マテリアルを描画し、そのあとにZソートした半透明マテリアルを後ろから順番に描画することである程度の問題を解決することができました。
Deferred Shadingでも基本は同じで、不透明マテリアルをGBufferに描画し、ライティングパスを起動してライティングを行った結果をフレームバッファに描画、その後に半透明マテリアルを描画します。
ですが、通常は半透明マテリアルの描画にはGBufferは用いず、半透明マテリアルだけForward Renderingを行うことになります。
なぜなら、GBufferの1ピクセルには1つの情報しか入れることはできませんが、半透明マテリアルがあるピクセルに複数書き込まれるような状態になった場合は手前の情報だけを保持すればいい、ということにはならないからです。
ならば半透明マテリアルを1つ描画したらライティングパスを起動して最終結果を求めて合成、これを半透明マテリアルの数だけ行うという方法はどうでしょう?
この方法ではそもそもDeferred Shadingによる多光源シーンの高速化が無意味になってしまいます。
結局、半透明マテリアルはForward Renderingで描画し、多光源シーンでも光源を限定しておいた方がいいということになるわけです。

UE4でももちろんこのような形で半透明マテリアルは実装されており、そのために半透明マテリアルにはかなりの制限がかけられています。
半透明マテリアルに対しても多光源計算を行う手法としてForward+ Renderingという手法もあるのですが、こちらはDX11世代以上が必要になるためか、UE4では採用されていません。

では、続きを読むで具体的なUE4での半透明マテリアルの使用方法、注意点などを解説していきます。

[[UE4] 半透明マテリアル]の続きを読む
  1. 2014/08/10(日) 13:52:30|
  2. UE4
  3. | トラックバック:0
  4. | コメント:0

[UE4] マテリアルノードの解説 その3

今回でマテリアルノードの解説はいったん終了します。
今回解説する分でよく使うノードはほとんど解説できていると思います。
とは言え、あくまで自分がパッと見た中でよく使いそうなものをピックアップしているので、人によっては使わないノードや解説されていないけどよく使うノードなんかもあるかもしれません。
何よりパッと見た程度なので抜けはあるかもしれませんので、抜けがあった場合はしれっとその4が更新されてるかもしれません。
その際には、視野の狭いおっさんはこれだから…と思って生暖かく見守っていただけたら、と。

今回解説するノードは主にUE4のシステム寄りのものが多くなります。
あとはいくつかのマテリアルファンクション。
マテリアルファンクションはEngine側のコンテンツとして存在しているので、内部の動作をチェックすることも可能です。
では、続きを読むで解説本編へ。

[[UE4] マテリアルノードの解説 その3]の続きを読む
  1. 2014/08/03(日) 11:51:38|
  2. UE4
  3. | トラックバック:0
  4. | コメント:0

プロフィール

monsho

Author:monsho
ゲームプログラマ?

最近の記事

最近のコメント

最近のトラックバック

月別アーカイブ

カテゴリー

ブロとも申請フォーム

この人とブロともになる

ブログ内検索

RSSフィード

リンク

このブログをリンクに追加する