UnityのシェーダでFloatやVectorをリニア変換対象にするGammaアトリビュートについてまとめます。
Unity2019.2.18
リニア変換?
UnityではPlayer Settingsから色空間をリニアに設定することでリニアワークフローで色を扱うことができます。
リニアワークフローでは、シェーダ内で色はリニア空間の値として扱われます。
すなわち人間の目に50%のグレーとして見える色は(0.5ではなく)約0.22の値として表されます。
この辺りについては以下の記事に詳しくまとめていますので、必要に応じて参照してください。
ここで、シェーダのプロパティとして色を入力することを考えます。
リニアワークフローでは上述の通りリニアの値で色が扱われますが、
だからと言ってリニアの値で色を入力するのは直観的ではありません。
仮に色をリニアの値で入力しようとすると、50%のグレーを0.22として入力しないといけなくなります。
そのため、シェーダプロパティで色を設定するときにはsRGB色空間の値で設定します。
そのsRGB色空間の値をシェーダに渡すときにUnityが内部的にリニア空間の値に変換しています。
これをリニアライズと呼びます。
FloatやVectorをリニア変換対象にするGammaアトリビュート
さて次にFloatやVectorについて考えます。
これらは色と違ってガンマワークフローでもリニアワークフローでも設定した値がそのままシェーダに渡されます。
ただし、場合によってはFloatやVectorもリニアワークフローではリニア変換を掛けてシェーダに渡したい場合があります。
これを実現するのがGammaアトリビュートです。
Gammaアトリビュートをシェーダのプロパティに付けることで、リニア設定時にリニア変換が行われるようになります。
Shader "Example" { Properties { [Gamma]_TestFloat("Test Float", float) = 0.0 } ... }
リニアワークフロー対応のシェーダを書くときにはこれを意識するようにしましょう。