前回書いた BC6H/BC7 のデータ化けですが BC1/DXT1 でも同様の問題が発生する
ことがわかりました。texconvex.exe に何らかの問題があるようです。
DirectX SDK August 2009 付属 texconv.exe と texconvex.exe を、それぞれ
x86 と x64 で比較してみました。
変換スクリプト(バッチ)
set DXSDK_UTILBIN=${DXSDK_DIR}Utilities/bin set BIN86=$DXSDK_UTILBIN/x86 set BIN64=$DXSDK_UTILBIN/x64 set CONV86=$BIN86/texconv.exe set CONVEX86=$BIN86/texconvex.exe set CONV86=$BIN64/texconv.exe set CONVEX86=$BIN64/texconvex.exe $CONV86 -ft dds -f DXT1 -m 1 -px dx9_dxt1_86_ t000.bmp $CONV64 -ft dds -f DXT1 -m 1 -px dx9_dxt1_64_ t000.bmp $CONVEX86 -10 -ft dds -f BC1_UNORM -m 1 -px dx10_bc1_86_ t000.bmp $CONVEX64 -10 -ft dds -f BC1_UNORM -m 1 -px dx10_bc1_64_ t000.bmp $CONVEX86 -11 -ft dds -f BC1_UNORM -m 1 -px dx11_bc1_86_ t000.bmp $CONVEX64 -11 -ft dds -f BC1_UNORM -m 1 -px dx11_bc1_64_ t000.bmp hexdump dx9_dxt1_86_t000.dds > dx9_dxt1_86_t000.txt hexdump dx9_dxt1_64_t000.dds > dx9_dxt1_64_t000.txt hexdump dx10_bc1_86_t000.dds > dx10_bc1_86_t000.txt hexdump dx10_bc1_64_t000.dds > dx10_bc1_64_t000.txt hexdump dx11_bc1_86_t000.dds > dx11_bc1_86_t000.txt hexdump dx11_bc1_64_t000.dds > dx11_bc1_64_t000.txt
入力は 512×512 サイズの bmp。mipmap 無し。
texconv と texconvex で出力拡張子の大文字小文字がばらばらなのも気になるところ。
131200 dx9_dxt1_64_t000.dds 131200 dx9_dxt1_86_t000.dds 131200 dx10_bc1_64_t000.DDS 131200 dx10_bc1_86_t000.DDS 131200 dx11_bc1_64_t000.DDS 131200 dx11_bc1_86_t000.DDS
出力ファイルサイズはすべて同一です。つまり 512*512*2 = 131072 、
131072 + 128 = 131200 なので、128byte の DDS ヘッダのみ追加されている状態です。
DXT10 ヘッダ (Direct3D 10 拡張ヘッダ) は存在していないことになります。
バイナリを比較すると、texconv を用いた下記 2ファイルは完全に同一です。
使用したコンバータが x86 か x64 だけの違いなので、一致していないと困ります。
・dx9_dxt1_64_t000.dds
・dx9_dxt1_86_t000.dds
texconvex を用いた dx10~, dx11~ の各ファイルはお互いにどれとも一致しませんでした。
それどころかコンバータを実行するたびにバイト単位で相違が生じています。
↓正常なファイル (dx9_dxt1_86_t000.dds)
00000000 : 44 44 53 20 7c 00 00 00 07 10 00 00 00 02 00 00 DDS |........... 00000010 : 00 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000020 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000030 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000040 : 00 00 00 00 00 00 00 00 00 00 00 00 20 00 00 00 ............ ... 00000050 : 04 00 00 00 44 58 54 31 00 00 00 00 00 00 00 00 ....DXT1........ 00000060 : 00 00 00 00 00 00 00 00 00 00 00 00 00 10 00 00 ................ 00000070 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000080 : a7 5b 23 11 d7 3f 0a 8a 49 6c 84 19 5e de a0 ca ここからデータ 00000090 : 74 9d e6 31 fd 3b 2b ed 91 9d e5 29 fa 58 16 d7 000000a0 : f6 ce c8 42 75 ff a8 af cc 84 e2 21 b7 aa f0 5e 000000b0 : eb 8c 61 2a c2 ca 7b ea 57 df c2 21 2f ad f5 d5 000000c0 : 92 be e2 29 82 02 a9 55 93 be a0 19 5f fe 0a a2 000000d0 : 57 d7 e2 3a 77 ea a0 a2 32 ae e6 4a 25 95 b8 c2 000000e0 : 79 e7 e8 4a 2a 28 b7 a5 36 d7 26 5b d6 b8 00 e0 000000f0 : d2 be e3 42 fc e2 e0 b7 4f be 82 32 ff d7 3a f8 00000100 : cd b5 80 21 a5 ea 5c f7 6d 7c 81 21 aa 22 d5 df
↓問題のファイル (dx11_bc1_86_t000.dds)
00000000 : 44 44 53 20 7c 00 00 00 06 00 00 00 00 02 00 00 DDS |........... 00000010 : 00 02 00 00 00 04 00 00 00 00 00 00 01 00 00 00 ................ 00000020 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000030 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000040 : 00 00 00 00 00 00 00 00 00 00 00 00 20 00 00 00 ............ ... 00000050 : 04 00 00 00 44 58 54 31 04 00 00 00 00 00 00 00 ....DXT1........ 00000060 : 00 00 00 00 00 00 00 00 00 00 00 00 00 10 00 00 ................ 00000070 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000080 : 00 00 00 00 00 00 00 00 24 2a 00 0e 24 86 08 00 00000090 : 80 00 4d 02 00 00 00 00 20 da 0d 00 00 00 00 00 000000a0 : 74 9d e6 31 fd 3b 2b ed 91 9d e5 29 fa 58 16 d7 000000b0 : f6 ce c8 42 75 ff a8 af cc 84 e2 21 b7 aa f0 5e 000000c0 : eb 8c 61 2a c2 ca 7b ea 57 df c2 21 2f ad f5 d5 000000d0 : 92 be e2 29 82 02 a9 55 93 be a0 19 5f fe 0a a2 000000e0 : 57 d7 e2 3a 77 ea a0 a2 32 ae e6 4a 25 95 b8 c2 000000f0 : 79 e7 e8 4a 2a 28 b7 a5 36 d7 26 5b d6 b8 00 e0 00000100 : d2 be e3 42 fc e2 e0 b7 4f be 82 32 ff d7 3a f8
・データ本体の先頭 16byte が欠けている
・データ本体の先頭に 32byte のゴミデータが挿入されている
・データ本体が 16byte 下がっている
これはまだましな方です。
dx10_bc1_64_t000.dds の場合 224byte の不明なデータが挿入されていました。
この症状は、以前下記エントリで試した texconv10.exe の頃と変わっていないような気がします。
ヘッダ部分の相違は下記の通り。こちらは特に問題は無いです。
・texconv (dx9) dwFlags= 0x00001007 = DDSD_PIXELFORMAT|DDSD_WIDTH|DDSD_HEIGHT|DDSD_CAPS dwPitchOrLinearSize= 0 (DDSD_LINEARSIZE が無いので無視できる) dwDepth= 0 (DDSD_DEPTH が無いので無視できる) dwMipMapCount= 0 (DDSD_MIPMAP が無いので無視できる) ・texconvex (dx11) dwFlags= 0x00000006 = DDSD_WIDTH|DDSD_HEIGHT dwPitchOrLinearSize= 0x400 (DDSD_LINEARSIZE が無いので無視できる) dwDepth= 1 (DDSD_DEPTH が無いので無視できる) dwMipMapCount= 1 (DDSD_MIPMAP が無いので無視できる) ・共通 dwSize = 0x007c = 124 = ヘッダサイズ dwWidth = 0x0200 = 512 dwHeight = 0x0200 = 512 dwPfSize = 0x0020 = 32 = PIXELFORMAT サイズ dwPfFlags= 0x0004 = DDPF_FOURCC dwFourCC = "DXT1" dwCaps = 0x1000 = DDSCAPS_TEXTURE
texconvex で出力フォーマットの指定を R8G8B8A8_UNORM にするとデータが全部ゼロで埋められてしまいます。
関連エントリ
・DirectX SDK August 2009 の解説と Direct3D 11 RTM
・Direct3D10 と DDS テクスチャフォーマット