※未検証な内容や書きかけの内容が含まれています。
座標変換
記事中での変数の表記を可読性の為に、以下で統一します。
Builtin(=Legacy)パイプラインに関する内容ですが、分かりやすいので変数名はURPのシェーダーの命名を踏襲しています。変数名の後に〇S
(=○○ Spaceの意)が接尾語として付けることでその座標やベクトルがその空間での値かを表しています。
変数名 | 意味 |
---|---|
positionOS | オブジェクト空間(ローカル空間)での座標 |
positionWS | ワールド空間での座標 |
positionVS | ビュー空間での座標 |
positionCS | クリップ空間での座標 |
Object to World (モデルtoワールド)
float4 positionOS = float4(x,y,z,1);
float3 positionWS = mul(unity_ObjectToWorld, positionOS);
World to Object(ワールドtoモデル)
float4 positionWS = float4(x,y,z,1);
float3 positionOS = mul(unity_WorldToObject, positionWS);
World to View(ワールドtoビュー)
float4 positionWS = float4(x,y,z,1);
float3 positionVS = mul(UNITY_MATRIX_V, positionWS);
View to World(ビューtoワールド)
float4 positionVS = float4(x,y,z,1);
float3 positionWS = mul(UNITY_MATRIX_I_V, positionVS);
View to Clip (ビューtoクリップ)
float4 positionVS = float4(x,y,z,1);
float3 positionCS = mul(UNITY_MATRIX_P, positionVS);
Clip to View (クリップtoビュー)
float4 positionCS = float4(x,y,z,1);
float3 positionVS = mul(UNITY_MATRIX_I_P, positionCS);
参考
https://docs.unity3d.com/Manual/SL-UnityShaderVariables.html
https://gist.github.com/sugi-cho/60b676bf04c0f971c182
https://gist.github.com/sugi-cho/2094612a6ba566f09e9e
深度関係
非線形の深度取得
描画APIによって[near, far] = [0, 1]
の場合と[near, far] = [1, 0]
の場合があるのでキーワードを使って反転。
0~1の線形の深度取得
ワールドスケールの線形深度取得
ワールド空間とビュー空間はスケールは同じなので、深度をビュー座標に作用させたい場合も同じです。
Depth to World (深度 to ワールド)