【Unity】ShaderでTextureの値(0.5)が正確に取得できない

はじめに

Shaderで思うようにTextureの値が正確に取得できなかったのでメモ

前提としてsRGBのチェックは外れていて、圧縮はしていないものとします。(値を正確に取得するのに必要なため)

環境は Unity 2021.3.25f1です

Universal Render Pipeline を使用しています。

128に設定しているTextureから0.5が取得できない

試しに(128,128,0)の値を見てみると0.5になっていません。

原因

0~255から0~1に変換すると計算式は 「128 / 255 = 0.5019...」になるためちょうど0.5で取得できてないみたいです

0.5を取得できないと困ること

ちょうど0.5を取得できないと0.5を基準とした計算がうまく動作しなくなります。

たとえば0~1を-1~1に変換した際に0.5に設定してるものは0に変換されてほしいのに0に変換されません。

そのため0.5を基準にするFlowMap使用して強度を上げる(極端ではありますが)と下記のようにUV全体が動いてしまいます

対策

0~1を-1~1に変換する際は通常は「テクスチャの値 -0.5 × 2」を使用しますが「テクスチャの値 -0.5019... × 2」にすることで128に設定している部分を0として計算に使用することができるようになります。(これでいいかは不明。なにかいいやりかたがあったら教えてください)