しゅみぷろ読者になるしゅみぷろプログラミングとかこの広告は、90日以上更新していないブログに表示しています。UnityはじめにShaderで投影を行う手法についてメモ用に書き残しておこうと思います。反射の描画みたいなことが出来るようになります。反射(水面)投影の考え方は、グラフィックスの基礎知識さえあればそれほど難しくありません。数式云々よりもイメージが大切です。座標変換とその座標系がどういった意味を持つのかをしっかりとイメージできれば理解しやすいと思います。投影について勉強する前にもう一度基礎を固めておくことをオススメします。esprog.hatenablog.com本記事ではGrabTextureのマッピング主にGrabPassを用いてオブジェクトの背面の絵を取得するのに使う投影マッピング主にProjectorやDepthShadow、反射の描画に使うといった順番で纏めていきます。Spaceで空間を統一し、その空間の座標で描画を行っているだけです。GrabPassを用いてオブジェクトの背面の絵を取得して描画する処理も、DepthShadowのように別の視点からレンダリングされた画像を使って影を投影するのも本質的には同じことです。後に紹介するShaderコードを見比べてみるとわかりやすいと思いますが、コード自体はほぼ同じになります。GrabTextureのマッピングGrabPassを用いてそれまでにレンダリングされたバッファを取得し、色を反転してオブジェクトに投影してみます。Sphereに以下のShaderを適用して動かしています。}}まずGrabPassでバッファを_BGTexという名前で取得します。今回の場合「Sphereの後ろにある部分の色を反転したい」ので、「後ろにある部分」の取得をどうにかする必要があります。これはSphereの各頂点がスクリーン(_BGTex)のどこにあたるのかがわかれば良いので、Projection変換してUV座標に直せばOKです。shaderで頂点をProjection空間へ持っていきます。shaderに渡します。shaderに渡されたProjection空間の座標は-1~1の値をとる同次座標です。同次座標を通常座標に直すためにはw要素で各要素を割る必要があります。値をUV座標として使うために0~1に変換する必要があるので、0.5を掛けて0.5足します。これが投影の基本となるShaderです。「背面の色を変えている」と考えるのではなく、「背面をテクスチャとして取得し、色を変えてオブジェクトに投影している」と考えて下さい。因みに、上記のShaderコードには少し無駄があります。「0.5を掛けて0.5足す」という処理をフラグメントシェーダーで行っている点です。「0.5を掛けて0.5足す」は、言い換えれば「大きさを0.5倍し、0.5平行移動する」ということです。$$の計算を行うことで、多少最適化出来ます。}これを行ってくれるのが、UnityCG.cgincのComputeGrabScreenPosです。これを使うと以下のように簡略化出来ます。}今回は実装例を簡単にするために色を反転するだけにしていますが、例えば法線マップで歪ませたり、それにリムライトをプラスして泡や水っぽいものを表現したりも出来ます。投影マッピングさて、本題。いっても、Grabでの投影が理解できていれば難しくはありません。投影時の「視点」が変わるだけです。具体的にはgrabPosを算出する時の変換行列が別の視点からのものに変わります。esprog.hatenablog.com上記の水面反射の記事で「頂点を反射用カメラの変換行列を用いて変換」の部分がこれに該当します。_RefVPや_RefWは、反射描画用カメラの変換行列です。