日別アーカイブ: 2009年9月13日

DirectX SDK August 2009 texconvex のデータ化け

前回書いた 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 の頃と変わっていないような気がします。

Direct3D10 と DDS テクスチャフォーマット

ヘッダ部分の相違は下記の通り。こちらは特に問題は無いです。

・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 テクスチャフォーマット