2014年2月18日火曜日

2Dテクスチャ~テクスチャの品質調整

Unity開発時に2Dテクスチャを扱うメモ。

■テクスチャの品質調整

Assetsウィンドウで何かテクスチャを選択すると Inspectorウィンドウにそのテクスチャの詳細設定が表示される。

テクスチャ品質の変更は各プラットフォーム毎に行うようになっている。
(まとめて全部の指定を変更はできない様子)。






















上の図はAssetsからテクスチャを選択した状態のInspectorウィンドウ。
Androidのマークが押されているので、Android向けビルド時のテクスチャ品質の設定欄が表示されている。
「Override for Android」にチェックを入れると設定が変更できるようになる。
設定を変えて「Apply」を押すとPreview欄にサイズ、形式、容量などが簡易表示されるので調整の目安になる。

  • Max Size: テクスチャサイズの指定。
    原画を指定サイズにリサイズして適用する。
    原画は細かく書いておいて、ここで各プラットフォーム毎に縮小して調整する用途が多いかと。
    圧縮方式は未確認。だいたい原画のサイズもここにリストされる倍数値サイズのどれかにしておく方が圧縮/縮小に有利かも?。

  • Format:
    • Compresse
      RGBA込みで1ピクセル=4ビットと公式に書かれており、Unityで標準的な圧縮テクスチャ。
      文面通りに取るとRGBAで4ビット=16階調しかないわけで多分pngのようなパレット式だと思う。仮にそうだとすると次に述べるようなことになる。

      言ってみれば16色カラーしかでない。ただしパレットで16色のそれぞれにはビット数の高い色を「割り当て」してる。(聡明期のパソコンのテクノロジーですねっ)
      この方式の弱点は半透過の絵に弱い。透過か非透過の1/0ならパレット2つで済むので綺麗にだしやすい傾向だが、半透過は境目にどうしても中間色がでてくる。16階調程度ではとても足りない。とにかくパレットが16しかないのであまり無茶は出来ない。※png形式もこのパレット式で保存すると透過抜き輪郭がギザる。

      この設定で綺麗に絵をのせるには16色しか原画に使わないようにするちょっと職人的な描き方が要求される。
      これの解のひとつに「タイルパターン」がある。これをうまく使うと色数が8色とかでも目の錯覚を利用して中間色表現ができる。昨今のペイントツールなら誤差拡散フィルタをうまくかけると似た結果を得られる。
      とにかくサイズが非常に小さくできるのがメリット。単色ベタ塗り系や動くモノ(は人の目を誤魔化せるので)には意外と有効。逆に静物でまじまじ見られると粗がわかりやすい。

    • 16 bits
      RGBA各4ビット=1ピクセル16ビット。
      絵によるが普通はこれで問題ないはず。しかしグラデーションによっては階調の境目が見えてしまい綺麗にみえない。
      対策は「タイルパターン」表現=誤差拡散でペイントツールで加工する位。
      一応パレットがありそうな気配だが、多分パレット数に上限があるのではないかと想像(最大256パレットとか)
      絵の色分布を描き方で調整する手もあるかもしれない(パレット数内に収容させる)。
      これまた動くモノとかまじまじ見られないものなら「気にしない」というのも簡単な解ではないかと思う(マテ。
      人の目は動くモノには「線」の要素=形状に敏感で、色の認識は遅いので瞬間的にはそこまで詳細は見えにくい(ハズ。

    • True Color
      RGB各8ビット=1ピクセル24ビット。最高画質。
      原画通りに綺麗に!。しかしサイズもすごいことになるっ。
      扉絵とかとにかく「絶対綺麗にみせたいぃぃぃい~」な部分でしか使えない予感。
      しかしこれを使ったら負けな気もする(最大性能使えば綺麗なのはアタリマエ。
      とはいえ綺麗にみせたいのも人情・・・
      実験 → 手元の絵4096x4096 True Colorテクスチャ(使用する全テクスチャをアトラス化すると妄想して)のInspector表示は42.7MB(凄。

  • Compression Quality:
    FormatがCompressedの時にだけ指定可能。圧縮率の指定。
    試した絵ではFast/Normal/Bestいずれでもサイズに大差ない。絵柄にかなり依存するのかもしれない?
    • Fast: 動作パフォーマンス重視
    • Normal: 中間のバランスを取る。
    • Best: 高画質重視


■透過/非透過で比較


サイズ比較の為に実験。
同じ絵柄にてアルファの有無で比較。サイズを見る目的だったのでアルファは適当に付与。

Compression QualityはNormalで統一。

◆原画1024x1024 RGB。png形式で879kB(TGA24ビット3MB相当)。
  • Compressed: RGB Compressed ETC 4bit。0.7MB
  • 16 bits:RGB16bit。2.7MB
  • True Color: RGB24bit。4.0MB
◆原画1024x1024 RGBA。png形式938kB(TGA32ビット4MB相当)。
  • Compressed: RGBA16bit 2.7MB
  • 16 bits:RGBA16bit 2.7MB
  • True Color: RGBA32bit 5.3MB
「16bits」では双方サイズに大差なし。しかしRGBAは絵のグラデーションが酷いことになった。
アルファに取られた分RGBが劣化した模様。ということはやはりパレットを使っているのかな?という気配。
RGBAだとCompressedでも自動的にUnityが「16bit」を選択してくるので、さすがに1ピクセル4ビットでは表現が無理と判断している様子。
True Colorはまんまアルファレイヤ分1MB増えてるので小細工無しの力技かな。



一応ここまでだいたいUnityをいじってみた感じ(+推測)で特徴がなんとなく見えてきた。
使用する絵柄種、アプリ内でどういうところに貼るかを加味してサイズ節約する足がかりになる。

■まとめ

実際のところまとめといえる程の確実な解は難しい。ケースバイケースなので。

一応私的に感じた傾向として列挙。

  • アルファレイヤは極力使わない。
    全く使わないのがベスト。
    アルファを使わずに絵の表現力で乗り切れるならそうすべき。と、いうか乗り切る方向を模索する。
    アルファはサイズ以外にレンダリング負荷も上がるので基本使わないのがベスト。
    窓のような部分はモデリングで抜くか透過テクスで誤魔化すか悩むところではある。ここはそのパーツの重要性とか面積等(光源影響も)によるのでカット&トライしないとわからないが半透過のレンダリングコストはかなり高い部類なのは意識しておく。

  • サイズを小さくする
    縦横を半分にすると面積は1/4なので効果大。少ないピクセル数でもぼかし具合とかで充分それっぽく表現できる(fpsゲーム等で良く使われてる)。
    Unity的には2048とか4096等の大きいサイズにアトラス化してしまうと高速らしいので、小さいサイズで描いて最後にアトラス化してしまうのも手かも。

  • 描く時から各Unityフォーマットの特性を考慮して合わせこむ気で描く。
    これができれば神業レベル。まず無理(マテ。
    しかし意識しておくだけでも違うはず。常に意識していれば徐々に自スキルもあがってくるので作業パターンも見えてくる(フィルタのかけ具合とか)。トレーニングという意味ではとても大事。

結局、モデリングや対象物のゲーム内での重要性なども関係するので一元的な解はない感じ。
だからこそゲームの出来の良し悪しもでてくる感じですかね。


追記: Androidでサイズをチューニングする場合
Texture Type: Advanced > Override for Android の Format を
変更するのがサイズ削減効果が高い。
自分が良く使う絵はだいたい傾向があるので、多数から選べるフォーマットを

一通り全部試してみた。
各フォーマット種での結果の特徴がなんとなくわかってくるので品質とサイズの
トレードオフで選択する感じに。

各フォーマットの圧縮方式による仕様上の特徴等も調べておくと少し参考になる。

0 件のコメント:

コメントを投稿