本日はUnityShader調査枠です。
Shaderでは3Dモデルの様々な情報を扱うことで様々な表現ができます。
今回はNormal(法線)をShaderで取得して表現を行っていきます。
今回は目標としてHoloLensのSpatialMeshの法線を取得して、床のみを描画するような表現を目指します。
〇Shader内での法線の使用法
法線はもともと3Dモデルが持つ情報です。

これは面および頂点ごとに持つ情報で、シェーディングなどにも関わってきます。
Shader内では次のようにモデルの持つ情報をそのまま使用することができます。
struct appdata
{
...
float3 normal:NORMAL;
};
struct v2f
{
...
float3 normal : NORMAL;
};
sampler2D _MainTex;
float4 _MainTex_ST;
v2f vert (appdata v)
{
v2f o;
...
o.normal = v.normal;
return o;
}
法線はXYZの3次元ベクトルであらわされます。
これをそのまま色として可視化すると次のようになります。

頂点シェーダーでオブジェクトの持つ情報をそのまま使用している場合オブジェクトごとのローカルの法線を使用しますが、UnityObjectToWorldNormal()を使用することでUnityのワールド座標に対しての法線を使用することができます。
o.normal = UnityObjectToWorldNormal(v.normal);

〇ShaderGraphでの法線の使用法
ShaderGraphではより簡単に法線を取得できます。
Normal Vectorノードを使用します。

Unity座標で使用する場合はScapeをWorld、オブジェクト座標で扱う場合はObjectとして使用します。
以上でUnity内でのモデルの法線の扱いをさらえました。
次回SpatialMeshのShaderとして法線を使用できるように応用してきたいと思います。