みつまめ杏仁

アンリアルエンジン(UE4)でGUIを作るためにゴニョゴニョしてます。UIデザイナーの皆様の助けになれば幸いです。

グレースケールテクスチャ 続き

Photoshopでいい感じのグレースケールテクスチャが作れたので、さっそくエンジンで検証します。もちろんUE4です。テクスチャだけの話だったらUnityでも使える内容ですが、ここからはアンリアルエンジンです。

テクスチャは2種類用意しました。

RGB24bpp の変換前のものと、 グレースケールに変換済みの2つです。どちらも同じ見た目ですが、ファイルサイズが違います。

f:id:hiyokosabrey:20180408134530p:plain

このテクスチャをインポートします。

 

どちらも同じ設定にします。このタイミングでGrayscaleを選択します。

f:id:hiyokosabrey:20180409215154p:plain

Compression SettingsGrayscaleに変えて、sRGB のチェックを外すと、晴れてリニアなグレースケールテクスチャとしてアセット化されます。

インポート後のDetailsタブを比べてみると・・・

f:id:hiyokosabrey:20180409215354p:plain

どちらも Resource Size8KbっておいおいPhotoshopでグレースケールにする意味なかったじゃん。なんか悔しいので、Contentフォルダの .uasset も一応チェック。

24bppの方は 3907Bytes 、 グレースケールの方は、 3745Bytes。うん、

ほんのちょっぴり差があった。ファイル名は2文字しか違わないので、何かしらおまけがくっついてるみたい。エンジンに取り込まれた後なら違いなんてなくて当たり前か。

 

さて次の検証。マテリアルの LinearGradientノードと勝負です。

f:id:hiyokosabrey:20180409220538p:plain

頑張って作ったテクスチャに何らかの変換がかかったりしてると悲しいので、計算で出力されるリニアなグラデーションと比べることで確認します。

「リニアな」というのは、0.0~1.0(0~255)までを何の補正もせず素直に使用している状態です。上の LinearGradientノードは値が偏らず均質なグラデーションになるうえ、テクスチャのような解像度というシガラミが無いのでゲージを作ったり背景などに大活躍です。

 

2つのテクスチャと、LinearGradientノードの合わせて3つで、マテリアルを作って、UMGで表示させてみました。

f:id:hiyokosabrey:20180409224435p:plain

なんだか明るいですが・・・3つとも同じように見えます。念のために適当な場所をサンプルとして差がないか確認します。

f:id:hiyokosabrey:20180409225839p:plain

残念ながら 0(黒)に近い部分で差異が出ています。画面キャプチャなので、エンジンの出力時に何らかの補正が入っているかもしれません。・・・というか全部にガンマ補正が入っているようです。中央が128じゃない時点で気づいてもおかしくないのですが、LinearGradientとの勝負でそこをスルーしてました。

sRGB空間な見た目なので、ノードで調整してみます。

f:id:hiyokosabrey:20180410232658p:plain

 

結果はずいぶんリニアっぽくなりました。

f:id:hiyokosabrey:20180410232726p:plain

ということで、何もせずそのままリニアなテクスチャを持ってきても、画面に表示されれば、sRGBになっているということが判明しました。

 

 今回リニアワークフローの検証をしたかったわけではないので、これ以上の深追いはやめておきます。そう、テクスチャの節約です。高解像度時代への橋頭保としてグレースケールテクスチャの扱い方を検証していたのでした。

 ちょっとサンプルを作ってみました。

用意したテクスチャはこれ。

f:id:hiyokosabrey:20180410235256p:plain

サイズは 1024x512pxです。圧がすごい・・・

次に用意したのは、

f:id:hiyokosabrey:20180410235408p:plain

サイズは 8x256px。

これをインポートして、マテリアルを作成します。

シンプルにマスクテクスチャとしての利用です。

f:id:hiyokosabrey:20180410235748p:plain

表示してみます。

ドーーーー~ン!という重低音が聞こえてきそうです。CMみたい。

f:id:hiyokosabrey:20180410235942p:plain

サイズ比較用に、解像度は同じ1024x512で RGBA8888 の 32bppのテクスチャを作ってみました。さっそく比較します。まずはG8から。

f:id:hiyokosabrey:20180411001212p:plain

f:id:hiyokosabrey:20180411001301p:plain

そしてRGBA32bpp

f:id:hiyokosabrey:20180411001313p:plain

f:id:hiyokosabrey:20180411001323p:plain

実に4倍の容量になります。圧縮すれば小さくなりますが、こういった文字やUI表示は劣化したテクスチャは悪目立ちします。凝った見た目は 32bppじゃないと無理ですが、クリアなエッジを保ちつつ、容量節約できた分バリエーションを持たせることができるグレースケール、どちらを採用するかはその都度相談しながら決めればいいかと思います。

 

大事なこと書くの忘れてました。UMGでは、直接グレースケールテクスチャを貼ることはできません。できなくはないですが見た目に赤くなります。しかも透過しない。

f:id:hiyokosabrey:20180411002631p:plain

これはチャンネルが 一つしかないためで、RGBAの4チャンネルのうち R

チャンネルのみに、グレースケールの値が適用されるからです。

 

普通にUMGで着色したい場合はこのようなマテリアルを用意します。

f:id:hiyokosabrey:20180411003527p:plain

これをImageパーツに適用すれば Color And Opacity で色が付けやすくなります。

f:id:hiyokosabrey:20180411003550p:plain

ちょっと手数が増えますが、テクスチャの容量が稼げるのが素晴らしいです。

マテリアルをちょこっと改造してインスタンス化できるようにしてみました。

f:id:hiyokosabrey:20180412000057p:plain

テクスチャサンプルパラメータノードに差し替えます。このノードに名前を付けて、テクスチャフォーマットをLinearGrayscaleに変えます。そして安全な状態にするために、

16x16程度の ■ ダミーテクスチャを作ってセットしておきます。

f:id:hiyokosabrey:20180412000539p:plain

このマテリアルからマテリアルインスタンスを作成します。マテリアルアイコンの上で右クリックして一番上にあるのを選択すると作ることができます。

f:id:hiyokosabrey:20180412000803p:plain

マテリアルインスタンスの中でテクスチャをセットする項目があるのでそこに用意したグレースケールテクスチャを登録します。

f:id:hiyokosabrey:20180412000901p:plain

あとはUMGで Image にセットするだけ。

 

基本はマスク的な使い方が一番向いてるのですが、ちょっと変わった使い方をしてみます。

 

Photoshopで雲模様フィルタを使うと簡単にシームレスなテクスチャが作れます。

f:id:hiyokosabrey:20180412053704p:plain

これを、Pannerでスクロールさせ、TexCoordに足してやると、

f:id:hiyokosabrey:20180412054420p:plain

 ゆらゆらと陽炎のように歪みます。水の中の表現としてもありです。

f:id:hiyokosabrey:20180412060452p:plain

 おなじ雲模様テクスチャに対してValueStepを使って掛けてみると、

f:id:hiyokosabrey:20180412055308p:plain

 ブループリントからScalaParameterノード ”Value” の値を 0.0~1.0 に変化させます。

f:id:hiyokosabrey:20180412060041p:plain

f:id:hiyokosabrey:20180412060050p:plain

f:id:hiyokosabrey:20180412060059p:plain

出現や消滅の演出に使えそうです。

 

といった感じで、まだまだ探せばネタはありそうですが、今回この辺にしておきます。

グレースケールテクスチャを使うと、テクスチャ容量を稼いでリッチな見た目を作るのができて楽しいです。

 

ではでは

豊かなグレースケールライフを!