[掲示板へもどる]
一括表示

  [No.816] ネプテューヌmk2とVのtidファイルの変換 投稿者:zentos02  投稿日:2012/09/21(Fri) 01:28:40

どうもはじめまして。
ぜんとすと申します。
ネプテューヌ2作品のイベントCGをtidから変換したくてたどり着きました。
もう解析がお済みになっているようなので、
よろしければ変換方法もしくはコンバータを教えていただけないでしょうか。


  [No.817] Re: ネプテューヌmk2とVのtidファイルの変換 投稿者:まくちゃん  投稿日:2012/09/21(Fri) 22:45:36

どうも。
ネプテューヌmkII、Vに使われているTIDファイル自体は圧縮や暗号化がされていなく画像は1ファイルに1枚のみなので簡単です。
基本的にデータ部分がDXTなのでヘッダ領域を解釈すればDDSファイルに変換できます。

以下のことは私の解釈なので間違いや足りないものがあると思います。

※TIDデータはPS3なのにビッグエンディアンです。

■ファイル構造
1. ヘッダ
2. データ情報
3. イメージデータ
の3つで構成されています。

■ヘッダは32byte or 16byteの2種類があります。

※このBBSシステムだとCの構造体が書けないので書き方を変えてます。

// TIDヘッダ構造体
struct stTID_HEADER
 u32 Signature;    // TIDx
 u32 FileSize;     // ファイルサイズ
 u32 DataOffset;   // データ先頭オフセット
 u32 n4;        // 謎
 u32 Flag;;       // 01 or ファイル名
 u32 NameOffset;  // ファイル名文字列先頭オフセット
 u32 n7;        // pad?
 u32 n8;        // pad?

■Signatureはアスキー文字でTIDが入ります。
4byte目の1byteはデータフォーマットとして解釈できます。

0x81:DXT1 or DXT5
0x83:32bit RGBA
0x87:32bit RGBA 高速転送用
0x89:DXT1 or DXT5
0x91:DXT1 or DXT5 (トゥーン用)
0x93:32bit RGBA
0x97:32bit RGBA 高速転送用
0x99:DXT1 or DXT5 (ミップマップ)

■2種類のヘッダを見分ける方法
自分はFlagに入っている値で判別してデータ情報のオフセットを変更しています。
0x00000001であれば0x20から開始
それ以外であれば0x10から開始

■データ情報
Flagから判断したオフセットから始まる構造体です。
Formatが0の場合32bit RGBAとして判断しますがSwizzleされた高速転送用の場合unSwizzleする必要があります。
するかしないかはヘッダの4byte目の値が0x87であるかで判別できます。
Swizzleされたテクスチャは主にキャラクターの3Dモデルの表情に使われるアニメーション用です。
イベントや立ち絵などには使用されていません。
またこの値でDXT1かDXT5かを判別できます。

struct stTID_INFO
 s8 name[0x20];   // ファイル名の文字列
 u32 InfoSize;     // データ情報のサイズ?
 u32 Width;       // 横幅
 u32 Height;      // 縦幅
 u32 n13;       // 謎
 u32 n14;       // 何かのフラグ?
 u32 n15;       // 謎
 u32 DataSize;    // イメージデータサイズ
 u32 DataOffset;   // イメージデータのオフセット
 u32 n18;       // 謎
 u32 Format;     // DXT1/DXT5などの文字列
 u32 DataSize2;   // イメージデータサイズその2
 u32 n21;       // 謎

■イメージデータ
イメージデータはDDS用のデータになっていたのでエンディアン変換やRGBAの配置を変更しなくても良かったはずです。
(自分のソースを見た感じ)

では頑張ってください。


  [No.818] Re: ネプテューヌmk2とVのtidファイルの変換 投稿者:zentos02  投稿日:2012/09/22(Sat) 22:11:42

どうもありがとうございます!
ちょっと難しい部分ありますがおかげさまで何とかなりそうです。


  [No.819] Re: ネプテューヌmk2とVのtidファイルの変換 投稿者:zentos02  投稿日:2012/09/23(Sun) 00:42:27

済みません。
ヘッダの構造覗いて0x93での32bitRGBA形式であることなどは判明したのですが、この場合unSwizzleせずにヘッダ部分全体をDXT1のものに置き換えることでDDSファイルとして読み込むことが出来る…ということでしょうか?
と勉強しながらやってみたのですが、どのように変換しても色の潰れたDDSファイルになってしまいます。
無知で済みません…この機会にデータの勉強をしたいのですが、よろしければご教授願えないでしょうか。


  [No.820] Re: ネプテューヌmk2とVのtidファイルの変換 投稿者:まくちゃん  投稿日:2012/09/24(Mon) 16:20:50

> ヘッダの構造覗いて0x93での32bitRGBA形式であることなどは判明したのですが、この場合unSwizzleせずにヘッダ部分全体をDXT1のものに置き換えることでDDSファイルとして読み込むことが出来る…ということでしょうか?

32bit RGBAは1ピクセルが32bit(4byte)で構成されています。
R、G、B、Aそれぞれの要素が1byteで256段階の階調を持ちます。
SwizzleされているかはヘッダのTIDの次にくる4byte目の値で判別できます。(前回の書き込みを参照)

DXTは1ピクセルを32bitでは持っていません。
DXT1〜DXT5までありますがそれぞれデータの持ち方が異なります。
因みにDXTは15bitでRGBを持ち2x2ピクセルの色の差でデータを圧縮しています。Aを何bitで持つかで1〜5が変わってきます。

> と勉強しながらやってみたのですが、どのように変換しても色の潰れたDDSファイルになってしまいます。
> この機会にデータの勉強をしたいのですが、

こういうことを勉強というのはどうかと思いますが、もし勉強というスタンスであればもっと悩み、知識を増やし勉強するべきです。
0から始めたのなら1日でわかるものではないと思います。

今はネットで検索すればいろいろ資料が出てきます。
DDSファイルはどういうものなのか?何故、私がBMPやPNGではなくDDSを選択したのか。
DXT1とはどういったアルゴリズムで圧縮し展開するのか。
これらの謎を解くにも沢山の知識を得なければなりません。
何も知らずにダンプエディタで数値を見てもわけがわからないと思います。
もし、いろいろなデータ構造を知っていると数値の並びを眺めただけで、これは何のデータか。どのような圧縮状態なのかなど予測や識別できるようになります。

映画マトリックスで特訓中のネオに暗号化された画面を見せ「これは赤いドレスの女だ」というシーンがあります。
まさにあの状態です。数値の配列を見てどんなデータかわかるようになってきます。その為には普段からいろいろなファイルをダンプエディタで眺め、データ配列をしていると記憶しておく必要があります。

こういうこと積み重ねることで今後、自力でデータ解析をし展開ツールを作成することが可能となるでしょう。

「勉強したいから教えて」
私は貴方の先生ではありませんw

「勉強したけど、この部分がわからない」
であればご協力します。


  [No.821] Re: ネプテューヌmk2とVのtidファイルの変換 投稿者:zentos02  投稿日:2012/09/24(Mon) 18:22:47

調べていくうちに興味を持ったのでこの分野を学んでいこうかと思います。
調べ尽くした上で次にどうしても分からないことがあればもう一度質問しに来ます。
どうもありがとうございます。