トマシープが学ぶ

Unity/VR/AR/デザイン好きのミーハー 記事内容は自分用のメモです

XDとUnityで透明度が違うときの変換

XDとUnityで透明度が違う

XDで作ったデザインをUnityに反映する作業をしているのだが、XDで設定されていた透明度をUnityのImageに適用したら全然見た目が違った!

Unityのほうが薄い(黒の場合)

XDはここの不透明度で変更

Unityはカラーコードの横で変更

 

理由

先輩が解決してくださいました。

変わる理由としては、色空間の違い。Unityは色空間をリニア設定していた

Unityの色空間をガンマにしたら恐らく同じになるが、3DCGを扱うときはリニアが一般的らしいのでリニアのままにしたい。

r-ngtm.hatenablog.com

docs.unity3d.com

TransparencyConverter

ということでsRGBをリニアに変換した透明度を計算してくれるツールを作ってくださいました。

github.com

PackageManagerから以下のgitURLで追加

https://github.com/sotanmochi/TransparencyConverter.git?path=Assets/TransparencyConverter

Windows>TransparencyConverterで以下のウィンドウが表示される。

手前の色と後ろの色の組み合わせによって正しい透明度が変わるので、どちらも設定する必要がある。一番上のTransparencyではXDで設定した不透明度をいれる。

 

そしてOutputで出てきた値をコピーしてUnityのImageの透明度に入れる。

 

これで最初のやつを再びやったら全く同じになった!

 

背景が同じでも手前が黒の時と白の時で出力される透明度は全然違う。

黒の時はUnityのほうがXDより不透明度が高くする必要があるが白は逆。

 

白黒の時の一覧表

手前が黒、背景が白のとき

Alpha values (sRGB, Linear): (1, 1)
Alpha values (sRGB, Linear): (0.9, 0.9908033)
Alpha values (sRGB, Linear): (0.8, 0.9677021)
Alpha values (sRGB, Linear): (0.7, 0.9275344)
Alpha values (sRGB, Linear): (0.6, 0.8678553)
Alpha values (sRGB, Linear): (0.5, 0.7866147)
Alpha values (sRGB, Linear): (0.4, 0.6820219)
Alpha values (sRGB, Linear): (0.3, 0.5524722)
Alpha values (sRGB, Linear): (0.2, 0.3965032)
Alpha values (sRGB, Linear): (0.1, 0.2127652)
Alpha values (sRGB, Linear): (0, 0)

手前が白、背景が黒のとき

Alpha values (sRGB, Linear): (1, 1)
Alpha values (sRGB, Linear): (0.9, 0.7872348)
Alpha values (sRGB, Linear): (0.8, 0.6034967)
Alpha values (sRGB, Linear): (0.7, 0.4475277)
Alpha values (sRGB, Linear): (0.6, 0.3179781)
Alpha values (sRGB, Linear): (0.5, 0.2133853)
Alpha values (sRGB, Linear): (0.4, 0.1321447)
Alpha values (sRGB, Linear): (0.3, 0.07246558)
Alpha values (sRGB, Linear): (0.2, 0.03229789)
Alpha values (sRGB, Linear): (0.1, 0.009196689)
Alpha values (sRGB, Linear): (0, 0)

画像書き出しの場合

透明度のある画像をXDから書き出してUnityに入れた場合も薄くなる

XDの60%とUnityの86%がだいたい一致する

画像設定のsRGBにチェック有無で変わるかと思ったが、入れた状態でも入れなくても変わらなかった・・・

XD側であらかじめUnityに合わせた透明度にして書き出すか、白一色で書き出してUnity側で透明度を変換するか