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

しゅみぷろ

プログラミングとか

Screen Space Reflection for Unity

C# Unity Shader

はじめに

UnityでSSR(Screen Space Reflection)に挑戦しました。 が、実際に出来たのは「SSRっぽい何か」です。

コア部分のみの実装のため、いわゆる「破綻を誤魔化す処理」は付加していません。 条件によっては結構不自然だったりします。

f:id:es_program:20160426000427p:plain

これを改善するために色々な手段を用いて「それっぽく見せていく」技術が必要になってくるのかなと思ってます。

今回はとりあえずSSRのコア部分が出来上がるまでをメモしておきます。

SSRの実装

ScreenSpaceで反射を計算し、反射方向に物体があった場合その物体の色を加算するといった処理を行います。 ScreenSpaceでの計算になるため厳密な反射を表現するのは無理ですが、なんとなくそれっぽい絵を作ることができます。

f:id:es_program:20160426000447p:plain

SSRを計算するための処理は

  1. カメラからScreenSpaceの描画ピクセル方向へのベクトルを計算
  2. オブジェクトの法線ベクトルを計算
  3. 上記2つの値から反射ベクトルを計算
  4. 反射ベクトルの方向に一定距離でレイを飛ばし、ヒットしたらその位置のピクセル色を加算する

処理はこれだけです。

おわりに

最初に書きましたが、普通に見ておかしいと感じるレベルです。反射によって取得した色をBlendする際に光度を下げればまぁまぁ見れなくもないですが、カメラを動かすと違和感あります。

一番気になるのが、反射方向にオブジェクトがなかった場合に急に色の加算が途切れ、境界がくっきりしてしまうことです。

こういった破綻をいい感じに誤魔化すためにいくつか対策や手法があるので、いつかそういった機能の実装にチャレンジしようと思います。

力不足感が否めないのでもうちょっと色々と勉強していかないとですね・・・

参考:kode80 - Screen Space Reflections in Unity 5