【Unity】【Shader Graph】浮動小数点数の精度を設定できるPrecision Modeについて

UnityのShader Graphで浮動小数点数の精度を設定できるPrecision Modeについてまとめます。

Unity2019.3.0
Shader Graph 7.1.8

はじめに

この記事ではUnityのShader GraphのPrecision Modeについてまとめます。
Shader GraphのPrecision Modeは浮動小数点数の精度を設定するための機能です。

Shader Graphの基本的な使い方については以下の記事にまとめていますので、必要に応じて参照してください。

light11.hatenadiary.com

また、シェーダにおける浮動小数点数の精度の取り扱いついては以下の記事にまとめています。

light11.hatenadiary.com

light11.hatenadiary.com

本記事はこれらの知識を前提としますので、必要に応じて参照してください。

Color Modeを変更してノードの精度を可視化する

Shader Graphで浮動小数点数の精度を設定する前に、まずノードに設定されている精度を可視化します。
そのためにはツールバーからColor ModeをPrecisionに切り替えます。

f:id:halya_11:20200226001008p:plain:w450
Color Modeの変更

すると、精度がFloatに設定されているノードは青、Halfに設定されているノードは赤に着色されます。

f:id:halya_11:20200226001219p:plain:w450
Color Modeによる着色

これでノード毎に設定されている精度が一目でわかるようになりました。

ノード/グラフに精度を設定する

それでは実際に精度を設定していきます。

まずノードの右上の歯車ボタンからはノード毎の精度を設定できます。
Floatに設定すればそのノードは単精度で計算され、Halfに設定すれば半精度で計算されます。
Inheritについては次節で説明します。

f:id:halya_11:20200226001618g:plain:w450
ノードの精度設定

またツールバーからはグラフとしての精度が変更できます。
この挙動についても次節で詳しく説明します。

f:id:halya_11:20200226003542g:plain:w450
グラフの精度設定

ノードの精度をInheritにした時の挙動

次にノードの精度をInheritに設定した時の挙動を見ていきます。

まず下図のように入力ポートに何も繋がっていないノードがInheritになっている場合には、
そのノードの精度設定はグラフの精度設定を継承します。

f:id:halya_11:20200226004812p:plain:w450
グラフの精度設定を継承

またもしInheritにしたノードの入力ポートに他のノードがつながっている場合には、
Inheritなノードの精度は入力ポートの精度と同じ精度になります。

f:id:halya_11:20200226005517g:plain:w450
入力ポートの精度と同じになる

また下図のようにInheritなノードに入力ポートが二つある場合には、
接続された二つの入力ノードの精度のうち高い方が適用されます。

f:id:halya_11:20200226005923p:plain:w450
精度が高い方が適用される

サブグラフと精度

前節の精度の適用ルールについてはサブグラフについても同様です。
サブグラフにもグラフの精度とノード毎の精度が設定できます。

f:id:halya_11:20200226010922p:plain:w450
サブグラフと精度

また、サブグラフの各ノードの精度の設定はあくまでサブグラフで完結するものであり、
メインのグラフに接続したとしてもメインのグラフの精度設定は一切反映されません。

関連

light11.hatenadiary.com

light11.hatenadiary.com

light11.hatenadiary.com

参考

docs.unity3d.com