要旨
Unity において屈折表現などを行うには、直前までの描画内容を取得する Grab Pass1 という機能が用いられる。 Grab Pass で得られる Grab Texture はプラットフォームによって座標系が異なる2 ため、直接 Shader を記述する場合は ComputeGrabScreenPos
マクロを使用して座標を得る。しかし ShaderForge の Screen Position
ノード3 は ComputeGrabScreenPos
を使用しておらず、 iOS 環境などで上下が反転する問題がある。
この記事では ShaderForge のノードエディタ上で ComputeGrabScreenPos
を用いて Grab Texture を正しく取得する。
環境
- Unity 2017.2.0f3
- ShaderForge v1.38
実装
以上!
解説
この問題に対処する一番シンプルな方法は、出力済みのシェーダコードに含まれる ComputeScreenPos
を ComputeGrabScreenPos
に置換することである。しかしこのシンプルな方法はシェーダファイルを ShaderForge で編集したが最後、置換内容はすべて吹き飛んでしまう。また ComputeGrabScreenPos
マクロの内容をノードエディタ上で再実装することもできるが、今後の Unity の仕様変更で いつの間にか バグってしまう恐れがある。
そこでこの記事の手法はポリゴンのワールド座標を用いて Projection 座標を Fragment Shader で再計算することで ComputeGrabScreenPos
マクロを使用可能とし、今後の Unity の仕様変更にも追従可能としている。