シムズ3オブジェクト作成備忘録: テクスチャの劣化を減らす

問題

テクスチャが劣化する
この画像のように(クリックで原寸大)、パターンを選ぶ画面では劣化なく綺麗に表示されていたテクスチャが、確定後ぐちゃっと潰れてしまう現象が発生しておりました。

(解りやすくしたつもりが逆にややこしくなってるかもしれませんが;、別にわざわざパターンを選択しなくても、カタログからこの机を選んで設置するだけで確定後と同じ表示になります。つまり劣化したほうが通常表示で、たまたまあとでパターン選択画面でだけ綺麗なことに気づいたのです)

これは机の確認のときに気づきましたが、よくよく観てみると卓上鏡でも程度の差こそあれ同様のことが起きていました。

試行錯誤

やってみたこと その1: DDS 圧縮の所為?

初めは DDS 圧縮時の劣化の所為だと思ってたんです。
机の Multiplier(陰影テクスチャだそうな)は Blender で自動作成(Bake)したこともあり、元々ノイズがちょっと入ってたんですね。その上 DDS 圧縮のおかげで余計に汚くなったんだろう…と思って、一から自分で描きました。
さらに、劣化が少ないという噂の Paint.Net というソフトを使い、元画像とほとんど変わらないくらいに保存することが出来ました!
ちなみにそれまでは DXTBmp か Gimp の DDS プラグインを使用してました。これら全部フリーソフトですw

木目パターンの場合は多少マシになったようにも感じましたが、幾何学模様にすると最初の画像のざまでした…><
DDS 圧縮での劣化はそれほど関係が無かったようです。

やってみたこと その2: パターンのタイリングが正しくないとか?

次に気になったのがパターンのタイリング。
画像の順序が逆になりますが、最初の画像はここでいじった後に撮ったものだったりします。ということでタイリングも関係無かったですね。
元々はパターンのタイリングを X4, Y4 にしていたため、より酷いことになってました。
パターンのタイリング X4, Y4 の場合の劣化の酷さを見よ!w
ほんと泣けるでしょ?あはは…;
木目だと、汚いけどまあいっか…と妥協するところだったので、こんな劣化が目立つパターンも設定しておいてよかったですよ~。配布した後に気づいて慌てなくて済んだw

やってみたこと その3: s3oc、s3pe がテストバージョンだったため?

あと気になったのが、私が使っていた s3oc と s3pe に密かにバグがあったりして? ということ。
12月初旬に当時の最新テストバージョンをインストールした後、たくさんバージョン上がってたにもかかわらずバージョンアップはしてなかったので;
そこで s3oc、s3pe 共に、12月末に最新安定版が出ていたので、こちらで作りなおしてみましたが結果は変わらずでした…。

やってみたこと その4: デフォルトオブジェクトの観察

s3oc、s3pe(と Blender のインポートプラグイン等)に問題があるのかどうか確認するために、クローンした後何もいじらないでおいたオブジェクトと、そのクローン元のオブジェクトを比較してみました。
Twitter でつぶやいた時点ではデフォルトオブジェクトでは劣化しないのだと思っていたんですが、よく観察してみると、このどちらのオブジェクトでも同じように多少の劣化はありました(卓上鏡もこのレベル)。でも私の机ほど酷くない!

Milkshape だったらデフォルトくらいの劣化で済むのだろうかと、もう Milkshape を買うべきか…でもそれ買うのだったらストア品買いたいしなぁ…w
という葛藤の中、MTS を検索していたら解決方法発見! Blender との関係はありませんでした!ε-(´∀`*)ホッ
ここでは ObjTool を使う古い方法だったので、再び今後のために記録しておこうと思います!(前置き長ぇ…)

この劣化っぷりがどれくらい改善したかだけ気になる方は、一気にテストプレイまで飛んで画像をご覧くださいw

目次

凄まじくテクスチャが劣化してしまった原因

参考にしたページ

上記ページによりますと、メッシュの項目(MLOD、MODL)に、テクスチャの大きさを設定する箇所(Mask Width/Height)があることが判りました。
通常、TextureTweaker3 でテクスチャを設定して保存する際に自動で設定されるはずなのですが、私の場合、Mask のサイズをほかのテクスチャよりも小さくしたことでその値が書き換えられなかったようです。

Multiplier と Specular のサイズは 512px 四方で作っていたのに、Mask の 256px 四方の設定が適用されていて劣化してしまったという訳でした(たぶん)。

設定項目は Mask Width/Height という名前ですし、Mask のサイズが使われるみたいなので、今回の場合の一番簡単な解決法は、Mask のサイズをほかのテクスチャと合わせることで済みます。
でも一度 512px にした Mask を再び 256px に変えた際は値が書き換えられなかったので、必ずとは言えないのですが…;

ただ、すべてのテクスチャのサイズを合わせればいいかというとまた違うんですよね。
この机で、Multiplier と Specular のサイズを Mask に合わせて 256px にしても汚いままです。何故かというと、オブジェクトの大きさにテクスチャのサイズが見合っていないから(たぶん)。小さい装飾オブジェクトなんかだと、256px でも十分綺麗でここまでの劣化は起きませんし。

テクスチャのサイズをオブジェクトの大きさに合ったサイズにしておくことってとても大事なことなんだな、と理解しました。
テクスチャをどんなサイズで作ればいいかは、What Size should my DDS Textures Be? @ TSR Wiki に書かれています。

TSR Workshop を使っていれば回避できた

そして、TSR Workshop でテクスチャをインポートした場合、この凄まじい劣化には遭遇しないはずですw
現在の設定と違う大きさのテクスチャをインポートすると必ず以下のようなダイアログが出てくるので、
TSR Workshop の便利なお知らせ
ここで「はい」を選ぶと自動的に Mask Width/Height をアップデートしてくれました。
アップデートしたくないときは「いいえ」にしておけば OK。

これでてるてる坊主ランプで劣化が起こらなかった謎が解けましたよ。
当時 TextureTweaker3 の存在を知らなかったので(あったのかどうかさえ判らないけど)、チュートリアル読んでも s3pe での設定方法を理解できず、テクスチャの設定を TSR Workshop で行ったんですよねw

凄まじい劣化の回避まとめ

そんなわけで、以下のどちらかをしておけば、凄まじい劣化は回避できます。

  • オブジェクトの大きさに合ったテクスチャサイズで作り、Mask の大きさも揃えておく。
  • TSR Workshop を使う。

ここから先は、Mask の大きさ関係なく Mask Width/Height の値を変更する方法をメモしておきます。
Mask の大きさを揃えておいても、自動的にアップデートされないこともあるかもしれませんしね!
(というか先にそれを書いてて、この項目は最後に追加したんですw)

ちなみに何故 Mask を小さくしたかというと、「ただパターンの変更場所を決めるだけの簡単な画像だし、小さくしておいても全く支障なさそう。package のファイルサイズも軽くなっていいんじゃないか」と思ったからです。
実際ファイルサイズは軽くなるし、Mask のサイズを小さくしておくデメリットってないように思うのですが、どうなんでしょう?

目次へ

s3pe で Mask Width/Height の値を修正する

変更箇所の確認

まず、s3pe で package ファイルを開いて、MLOD(Group「0x00000000」) をクリックしてみてください。
Preview を Value にしていると、プレビューウィンドウ(?)にずらーっと英数字が表示されると思います。下の方までスクロールすると、以下の画像のような文字列が現れます。
プレビューで見るべき所
この四角で囲った「MaskWidth」と「MaskHeight」の値を変更していきます。

あと、ChunkEntries の []内の英数字と、SData の Mask Width/Height にあたる []内の英数字も覚えておいてください。
今回の机の場合、ChunkEntries 2箇所([0C], [0D])、Mask Width/Height は全部で8箇所ありました。

MLOD(Group「0x00000000」)はグラフィック高設定時に使われるメッシュなので、低設定時に使われる MODL(Group「0x00000001」) も同様に変更したほうがいいかと思います。

値を変更するタイミングにご注意

クローン元のメッシュをエクスポートする前に変更しても大丈夫なのかは判りません。
しかし上のほうでもちょこっと書いたように、設定をいじった後に TextureTweaker3 で編集し保存してしまうと、Mask のサイズに書き換えられてしまう場合があることを確認してます。ただ変わらない場合もあって、「絶対このときに書き換えられる」とは言えないのですが…;
とにかく、何かの拍子に勝手に書き換えられる可能性があるので、この値は完成間近の最後のほうでいじったほうがよさそうです。

Data Grid で値を変更する

  1. Tag「MLOD」、Group「0x00000000」と書かれた項目を選択し、下の画面の「Grid」をクリックします。
    Data Grid の出し方

  2. ChunkEntries の左の三角をクリックすると、番号付きの ChunkEntries がずらーっと出てきます。
    先ほどプレビューで確認したときに覚えた番号の ChunkEntries を開きます(ここでは [0C])。
    どんどん階層を開いていく

  3. さらに RCOLBlock → Mtnf → SData と開いていき、MaskWidth と MaskHeight にあたる番号の SData を開きます。
    MaskWidth と MaskHeight の格納場所

  4. そして MaskWidth/Height それぞれ2箇所の Data を変更すればいいんですが(上記画像の四角で囲った部分)、0x00000100 ってなんのこっちゃって感じですよね。普通、サイズといえば px なのに。
    Tutorials:TS3 Meshing FAQ - My texture is Blurry によると、px との関係は以下のようになっているそうです。

    Mask Width/Height Values:

    • 00000080 is 128
    • 00000100 is 256
    • 00000200 is 512
    • 00000400 is 1024

    私の机の場合、MaskWidth/Height 共に 256px に設定されていたことが判りました(Mask のサイズですね)。
    Multiplier等のメインテクスチャは 512×512px で作っているので、すべて 512px である 0x00000200 に変更しました!

  5. もうひとつ MaskWidth/Height を含む ChunkEntries [0D] があるので、同様に変更しておきます。

  6. Commit して Data Grid を閉じ、保存します。

  7. それから MODL(Group「0x00000001」)でも同じ作業を繰り返します。

これで終わりです!

目次へ

TSR Workshop での Mask Width/Height の在り処

先に書いたように TSR Workshop ではテクスチャインポート時に自動でアップデートしてくれますが、一応書いておきます。

  1. 「Mesh」タブを開き、「Default material」をクリックしたら右端に出てくる「...」ボタンをクリック。
    TSR Workshop の Meshタブ

  2. プロパティ内にある「Mask width」と「Mask height」4つがそれです。
    TSR Workshop の Material Editor
    こちらは s3pe と違って px のまま記入すればいいみたいなので簡単ですね!

  3. Medium level of detail のほうもお忘れなく。

とはいえ、こちらでの作業はしていないのでまだ他にも設定箇所があったらすみません。

目次へ

ゲームに入れてテストする

上記の設定を終えた後、私の机はこうなりました。
MaskWidth/Height を 512px にした場合
デフォルトオブジェクトと同じくらいの多少の劣化はありますけど、妥協できるレベルになりました!

それじゃあ MaskWidth/Height を 1024px に設定してみたらどうよ?

この値を上げたら綺麗になったので、気になるってもんですよね?
試してみたらなんと、
MaskWidth/Height を 1024px にした場合
劣化しなくなりました…!(喜)
実はよーく比べると、ほんの少し劣化してますけど、些細すぎることですw
あと真っ黒になってしまうんでずっと気になっていた脚の部分の光の反射がそのままなのが嬉しい!(これは Specular をより反射するように修正することでも直った)
テクスチャの大きさは 512px のままですよ。パターンのタイリングは当初のほうに変えましたけど。

でも気になるのは負荷の問題。普通のときより単純に考えて2倍 VRAM 食われたりして…?(よく解らず発言してます;
ハイディテールだけ 1024px にして、ローディテールは 512px に設定しておいたらいいかな?
一度綺麗な状態を見てしまうと、もう 512px に下げる気が起きないんですがはは…;

目次へ

テクスチャの劣化を(ほぼ)なくす方法

  • Mask Width/Height の値を、実際のテクスチャサイズよりも一段階大きいサイズで設定しておくと、ほとんど劣化がなくなる!
    ただその分、余計な負荷がかかってしまうかもしれない?

私はもうこうしてしまおうと思っているんですけど、配布するときは両方用意したほうがいいんですかね?
みなさんのご意見聞いてみたいです。よろしければお願いします~!

目次へ

このエントリーへのコメント

Disqus のほかにも Twitter や Google、Facebook アカウントでもログイン出来ます。
ログインしないで投稿するにはメールアドレスが必要ですが、サイト上には表示されませんのでお気軽にどうぞ(*^_^*)("アカウントを作成せず投稿する" にチェックを入れてください)

blog comments powered by Disqus