LoginSignup
10
9

More than 5 years have passed since last update.

[Unity][Shader Forge] World座標をScreen座標に変換する

Last updated at Posted at 2016-10-16

内容

GrabTextureを使用して後ろに描画されたオブジェクトをそのまま描画しようとしたとき
World座標をScreen座標に変換したくなります。
しかし下の画像のようにTransformノードを使用してもうまく変換されない:disappointed_relieved:

image

そのための対応策をメモとして残しておきます。

環境

Unity5.4.0p4
Windows10

結果

以下のようにすることで対応することができた。

image

ここで使用したコードは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ノードから出力される値と同じになります。:laughing:
Ojbect PositionはWorld座標だけどスクリーン座標に変換する術をもたない
そういった値で使用することを想定しています。

試行錯誤

ShaderForgeで提供されているノードだけで実装できないか試した。
実装方法は以下の通り。

image

結果は画像のとおり。
何がダメかというとTransformのViewへの変換は以下のコードに変換されていた。

mul( UNITY_MATRIX_V, float4(i.posWorld.rgb,0) )

OH!:weary:

10
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
9