内容
GrabTextureを使用して後ろに描画されたオブジェクトをそのまま描画しようとしたとき
World座標をScreen座標に変換したくなります。
しかし下の画像のようにTransformノードを使用してもうまく変換されない
そのための対応策をメモとして残しておきます。
環境
Unity5.4.0p4
Windows10
結果
以下のようにすることで対応することができた。
ここで使用したコードはStackOverflowを参考に実装した。
コードの内容は以下のとおりになる。
float4 clipSpacePos = mul(UNITY_MATRIX_VP, float4(worldPosition, 1.0));
float3 ndcSpacePos = clipSpacePos.xyz / clipSpacePos.w;
float2 windowSpacePos = ((ndcSpacePos.xy + 1.0) / 2.0);
#if UNITY_UV_STARTS_AT_TOP
windowSpacePos.y = 1-windowSpacePos.y;
#endif
return windowSpacePos;
DirectX系とOpenGL系でのY軸の位置が違うためにプリプロセスを導入している。
Windows環境とAndroid環境での動作確認をした。
補足
ちなみに変換後の値についてはScreen Positionノードから出力される値と同じになります。
Ojbect PositionはWorld座標だけどスクリーン座標に変換する術をもたない
そういった値で使用することを想定しています。
試行錯誤
ShaderForgeで提供されているノードだけで実装できないか試した。
実装方法は以下の通り。
結果は画像のとおり。
何がダメかというとTransformのViewへの変換は以下のコードに変換されていた。
mul( UNITY_MATRIX_V, float4(i.posWorld.rgb,0) )
OH!