ddsformat
差分
このページの2つのバージョン間の差分を表示します。
両方とも前のリビジョン前のリビジョン次のリビジョン | 前のリビジョン最新のリビジョン両方とも次のリビジョン | ||
ddsformat [2015/05/26 14:09] – [dwPitchOrLinearSize] oga | ddsformat [2015/05/26 16:44] – [ヘッダ設定コードの例] oga | ||
---|---|---|---|
行 95: | 行 95: | ||
==== dwPitchOrLinearSize ==== | ==== dwPitchOrLinearSize ==== | ||
- | dwFlags に DDSD_PITCH または DDSD_LINEARSIZE が含まれている場合に有効になります。 | + | dwFlags に DDSD_PITCH または DDSD_LINEARSIZE が含まれている場合に有効になります。あまり重要なフィールドではありません。 |
- | あまり重要なフィールドではありませんが、DDSD_PITCH の場合は列ごとに 4byte 等の任意のアライメントで格納されている可能性があります。 | + | |
- | この場合は念のためデータを pitch に従って読み込む必要があります。 | + | |
| DDSD_LINEARSIZE | | DDSD_LINEARSIZE | ||
- | | DDSD_PITCH | + | | DDSD_PITCH |
- | |||
- | 非圧縮時の pitch を使った擬似コード | ||
- | <code cpp> | ||
- | if( header-> | ||
- | const unsigned char* read_ptr= data_ptr; | ||
- | assert( header-> | ||
- | unsigned int pixel_size= header-> | ||
- | unsigned int row_pitch= header-> | ||
- | ~ | ||
- | for( unsigned int y= 0 ; y< height ; y++ ){ | ||
- | const unsigned char* rptr= read_ptr; | ||
- | for( unsigned int x= 0 ; x< width ; x++ ){ | ||
- | memcopy( write_ptr, rptr, pixel_size ); | ||
- | write_ptr+= pixel_size; | ||
- | rptr+= pixel_size; | ||
- | } | ||
- | read_addr+= row_pitch; | ||
- | } | ||
- | } | ||
- | </ | ||
圧縮テクスチャの場合は pitch には 1列分の block サイズが入ります。 | 圧縮テクスチャの場合は pitch には 1列分の block サイズが入ります。 | ||
行 130: | 行 108: | ||
ただし、圧縮テクスチャの場合も結局 MipmapLevel 毎に同様の block 単位のアライメントサイズの再計算を行う必要があるので、実際の実装ではこのフィールドの値が必要になることがありません。 | ただし、圧縮テクスチャの場合も結局 MipmapLevel 毎に同様の block 単位のアライメントサイズの再計算を行う必要があるので、実際の実装ではこのフィールドの値が必要になることがありません。 | ||
- | 同じ理由から、非圧縮の場合も行単位でアライメントを調整した row_pitch を格納することをお勧めしません。 | ||
- | |||
- | |||
- | |||
==== dwMipMapCount ==== | ==== dwMipMapCount ==== | ||
行 142: | 行 116: | ||
ただし dwFlags DDSD_MIPMAPCOUNT を正しく判定していないツールやライブラリが存在する可能性があるため、安全のために常に 1 以上の有効な値を入れて置くことをおすすめします。 | ただし dwFlags DDSD_MIPMAPCOUNT を正しく判定していないツールやライブラリが存在する可能性があるため、安全のために常に 1 以上の有効な値を入れて置くことをおすすめします。 | ||
- | また読み出す場合あ、DDSD_MIPMAPCOUNT が立っていたとしてもこのフィールドが 0 である可能性を考慮した方が良いでしょう。 | + | また読み出す場合、DDSD_MIPMAPCOUNT が立っていたとしてもこのフィールドが 0 である可能性を考慮した方が良いでしょう。 |
<code cpp> | <code cpp> | ||
行 407: | 行 381: | ||
header.dwMipMapCount= 1; | header.dwMipMapCount= 1; | ||
header10.ArraySize= 1; | header10.ArraySize= 1; | ||
+ | header10.Dimension= DDS10_DIIMENSION_2D; | ||
if( 非圧縮時 ){ | if( 非圧縮時 ){ | ||
行 437: | 行 412: | ||
header.dwCaps2|= DDSCAPS2_VOLUME; | header.dwCaps2|= DDSCAPS2_VOLUME; | ||
header.dwDepth= depth; | header.dwDepth= depth; | ||
+ | header10.Dimension= DDS10_DIMENSION_3D; | ||
} | } | ||
行 470: | 行 446: | ||
} | } | ||
</ | </ | ||
- | |||
ddsformat.txt · 最終更新: 2015/05/26 16:45 by oga