ddsformat
差分
このページの2つのバージョン間の差分を表示します。
| 両方とも前のリビジョン前のリビジョン次のリビジョン | 前のリビジョン | ||
| ddsformat [2015/05/26 13:47] – [dwPitchOrLinearSize] oga | ddsformat [2015/05/26 16:45] (現在) – [DDS のヘッダ構造] oga | ||
|---|---|---|---|
| 行 62: | 行 62: | ||
| unsigned int ArraySize; | unsigned int ArraySize; | ||
| unsigned int MiscFlag2; | unsigned int MiscFlag2; | ||
| + | }; | ||
| + | enum { | ||
| + | DDS10_DIMENSION_1D = 2, | ||
| + | DDS10_DIMENSION_2D = 3, | ||
| + | DDS10_DIMENSION_3D = 4, | ||
| }; | }; | ||
| </ | </ | ||
| 行 95: | 行 100: | ||
| ==== dwPitchOrLinearSize ==== | ==== dwPitchOrLinearSize ==== | ||
| - | dwFlags に DDSD_PITCH または DDSD_LINEARSIZE が含まれている場合に有効になります。 | + | dwFlags に DDSD_PITCH または DDSD_LINEARSIZE が含まれている場合に有効になります。あまり重要なフィールドではありません。 |
| - | この値が DDSD_LINEARSIZE の場合はあまり重要なフィールドではありません。 | + | |
| - | DDSD_PITCH の場合は列ごとにアライメントされている可能性があるため、データを 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 サイズが入ります。 | ||
| 例えば 256x256 の DXT1 なら、横は 256/4 = 64 block となります。 | 例えば 256x256 の DXT1 なら、横は 256/4 = 64 block となります。 | ||
| DXT は 1block = 64bit なので pitch = 64block x 64bit / 8bit = 512byte です。 | DXT は 1block = 64bit なので pitch = 64block x 64bit / 8bit = 512byte です。 | ||
| - | |||
| 同様に 250x250 のような半端なサイズのテクスチャも、block 単位に切り上げて計算する必要があります。 | 同様に 250x250 のような半端なサイズのテクスチャも、block 単位に切り上げて計算する必要があります。 | ||
| - | ((250 + 3)>> | + | ( ( 250 + 3) >> 2) block x 64bit / 8bit = 504byte |
| - | + | ||
| - | ただし、圧縮テクスチャの場合も結局 MipmapLevel 毎に同様の block 単位のアライメントサイズの再計算を行う必要があるので、実際の実装では pitch の値が必要になることがありません。 | + | |
| - | + | ||
| - | + | ||
| + | ただし、圧縮テクスチャの場合も結局 MipmapLevel 毎に同様の block 単位のアライメントサイズの再計算を行う必要があるので、実際の実装ではこのフィールドの値が必要になることがありません。 | ||
| ==== dwMipMapCount ==== | ==== dwMipMapCount ==== | ||
| 行 143: | 行 121: | ||
| ただし dwFlags DDSD_MIPMAPCOUNT を正しく判定していないツールやライブラリが存在する可能性があるため、安全のために常に 1 以上の有効な値を入れて置くことをおすすめします。 | ただし dwFlags DDSD_MIPMAPCOUNT を正しく判定していないツールやライブラリが存在する可能性があるため、安全のために常に 1 以上の有効な値を入れて置くことをおすすめします。 | ||
| - | また読み出す場合あ、DDSD_MIPMAPCOUNT が立っていたとしてもこのフィールドが 0 である可能性を考慮した方が良いでしょう。 | + | また読み出す場合、DDSD_MIPMAPCOUNT が立っていたとしてもこのフィールドが 0 である可能性を考慮した方が良いでしょう。 |
| <code cpp> | <code cpp> | ||
| 行 408: | 行 386: | ||
| header.dwMipMapCount= 1; | header.dwMipMapCount= 1; | ||
| header10.ArraySize= 1; | header10.ArraySize= 1; | ||
| + | header10.Dimension= DDS10_DIIMENSION_2D; | ||
| - | if( ((width * height * bit_count) >> 3) != row_pitch | + | if( 非圧縮時 |
| header.dwFlags|= DDSD_PITCH; | header.dwFlags|= DDSD_PITCH; | ||
| - | header.dwPitchOrLinearSize= | + | header.dwPitchOrLinearSize= |
| }else{ | }else{ | ||
| header.dwFlags|= DDSD_LINEARSIZE; | header.dwFlags|= DDSD_LINEARSIZE; | ||
| - | header.dwPitchOrLinearSize= (width * height | + | header.dwPitchOrLinearSize= (block_width |
| } | } | ||
| 行 438: | 行 417: | ||
| header.dwCaps2|= DDSCAPS2_VOLUME; | header.dwCaps2|= DDSCAPS2_VOLUME; | ||
| header.dwDepth= depth; | header.dwDepth= depth; | ||
| + | header10.Dimension= DDS10_DIMENSION_3D; | ||
| } | } | ||
| 行 449: | 行 429: | ||
| if( !isdx10 && | if( !isdx10 && | ||
| header.dwPfFlags|= DDPF_RGB|DDPF_ALPHAPIXELS; | header.dwPfFlags|= DDPF_RGB|DDPF_ALPHAPIXELS; | ||
| - | header.dwRGBBitCount= | + | header.dwRGBBitCount= |
| header.dwRBitMask= .. | header.dwRBitMask= .. | ||
| header.dwGBitMask= .. | header.dwGBitMask= .. | ||
| 行 471: | 行 451: | ||
| } | } | ||
| </ | </ | ||
| - | |||
ddsformat.1432615665.txt.gz · 最終更新: by oga
