LoginSignup
4
5

More than 1 year has passed since last update.

Unity Shader チートシート (Builtin Pipeline)(WIP)

Posted at

※未検証な内容や書きかけの内容が含まれています。

座標変換

記事中での変数の表記を可読性の為に、以下で統一します。
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 ワールド)


4
5
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
4
5