質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

634閲覧

画像を外部ファイルから取り込む際に透過画像に白いフチが入ってしまい綺麗な透過ができない

namari82

総合スコア11

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2023/11/07 13:09

実現したいこと

・ユーザーがフォルダに入れた透過画像を動的に取得して綺麗に表示したい。
・画像にはアンチエイリアスをかけたい。

前提

Unityでカスタマイズが効くタイプのデスクトップマスコットツールを作っています。

発生している問題・エラーメッセージ

FilterMode.Bilinearで読み込むと、白いフチが周りについてしまい、綺麗に表示できない。(FilterMode.Trilinearでも同様)
イメージ説明

FilterMode.Pointで読み込むと、透過は綺麗にできるが、アンチエイリアスが入らないので荒い表現になってしまう。
イメージ説明

これは外部ファイルからの画像読み込みでなく、一般的な方法で画像を単に表示した場合です。これが理想の表示です。
イメージ説明

該当のソースコード

C#

1private static Texture2D LoadImageAsync(byte[] data) 2 { 3 // Decodes an image on a thread pool. 4 var imageResult = ImageDecoder.DecodeImage(data); 5 6 // Creates a texture and set the pixel data on the main thread. 7 return imageResult.ToTexture2D(); 8 } 9 10 public static Sprite LoadSprite(string path) 11 { 12 if(System.IO.File.Exists(path)){ 13 var rawData = System.IO.File.ReadAllBytes(path); 14 Texture2D texture2D = LoadImageAsync(rawData); 15 texture2D.filterMode=FilterMode.Bilinear; 16 17 //Texture2D texture2D = new Texture2D(0, 0); 18 //texture2D.LoadImage(rawData); 19 //texture2D.filterMode=FilterMode.Bilinear; 20 var sprite = Sprite.Create(texture2D, new Rect(0f, 0f, texture2D.width, texture2D.height),new Vector2(0.5f, 0.5f), 100f,0,SpriteMeshType.FullRect); 21 22 return sprite; 23 } 24 else{ 25 return null; 26 } 27 }

ImageDecoder.DecodeImageはMochineko.StbImageSharpForUnityという外部アセットを使っていますが、基本的な流れは読み込んだバイト列→テクスチャ2D→Spriteに変換しているだけです。コメントアウトしているLoadImageを使った方法でも同様の現象が起きます。

補足情報(FW/ツールのバージョンなど)

Unity2021.3.28f1

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

namari82

2023/11/07 18:04

ありがとうございます。類似の質問に見えるのですが、英語の理解が怪しいのかいまいち改善に繋がりませんでした。Sprite.Createの際にRectを少し内側に小さめに読み込んでみたり、wrapModeをTextureWrapMode.Clampに設定したりしたのですが…
hoshi-takanori

2023/11/07 20:04

たぶん、その画像の透過してる部分の色が白で、アルファ値が 0 なんだと思います。アルファ値が 0 の部分は、普段は無視されるので何色でも問題ありませんが、アンチエイリアス処理の際に隣接するピクセルの値をブレンドする処理が行われ、白っぽくなってしまうのでしょう。 輪郭が黒い画像なら、透過部分の色も黒くすれば大丈夫だと思いますが、ユーザーがフォルダに入れた任意の画像に対して、透過部分の色を輪郭の色に合わせるのはちょっと難しい気がしますね。 なお、gimp とか使えば透過部分の色を確認することはできると思いますが、編集できるかは知りません。
namari82

2023/11/08 06:10

なるほど原因が分かりました。確かに解決は難しそうですね…スクリプトによる読み込みのときだけ発生するので何か解決策があると思いましたが… ありがとうございます。
guest

回答1

0

自己解決

完全な解決にはならなかったですが、hoshi-takanoriさんのおかげで原因が分かりました。
透過部分がアルファ値0の白色を採用している場合、アンチエイリアスでこの白色を計算に入れてしまったために起こってしまう現象とのことです。

https://github.com/SpriteStudio/SS5PlayerForUnity/issues/50
photoshopが原因になることが多いらしく、試しにGIMPで出力してみたら発生しませんでした。

解決にはなっていませんが、原因が分かり、解決は難しそうですので質問を閉じます。

投稿2023/11/08 09:51

namari82

総合スコア11

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問