ユーザ用ツール

サイト用ツール


ddsformat

差分

このページの2つのバージョン間の差分を表示します。

この比較画面へのリンク

両方とも前のリビジョン前のリビジョン
次のリビジョン
前のリビジョン
ddsformat [2015/05/26 13:57] ogaddsformat [2015/05/26 16:45] (現在) – [DDS のヘッダ構造] oga
行 62: 行 62:
     unsigned int    ArraySize;      // Texture Array を格納する場合に必要     unsigned int    ArraySize;      // Texture Array を格納する場合に必要
     unsigned int    MiscFlag2;      // 0     unsigned int    MiscFlag2;      // 0
 +};
 +enum {
 +    DDS10_DIMENSION_1D = 2,
 +    DDS10_DIMENSION_2D = 3,
 +    DDS10_DIMENSION_3D = 4,
 }; };
 </code> </code>
行 95: 行 100:
 ==== dwPitchOrLinearSize ==== ==== dwPitchOrLinearSize ====
  
-dwFlags に DDSD_PITCH または DDSD_LINEARSIZE が含まれている場合に有効になります。 +dwFlags に DDSD_PITCH または DDSD_LINEARSIZE が含まれている場合に有効になります。あまり重要なフィールドではありません。
-あまり重要なフィールドではありませんが、DDSD_PITCH の場合は列ごとに 4byte 等の任意のアライメントで格納されている可能性があります。 +
-この場合は念のためデータを pitch に従って読み込む必要があります+
  
 | DDSD_LINEARSIZE  | 最初の face の最初の miplevel 0 の画像の byte 数。  | | DDSD_LINEARSIZE  | 最初の face の最初の miplevel 0 の画像の byte 数。  |
-| DDSD_PITCH       | 最初の miplevel 0 の画像の横 1列の byte 数。(dwWidth * dwRGBBitCount) >> 3。圧縮テクスチャの場合、block 単位の 1列分の byte サイズ。    |+| DDSD_PITCH       | 最初の miplevel 0 の画像の横 1列の byte 数。圧縮テクスチャの場合、block 単位の 1列分の byte サイズ。    |
  
- 
-非圧縮時の pitch を使った擬似コード 
-<code cpp> 
-if( header->dwFlags & DDSD_PITCH ){ 
-    const unsigned char*  read_ptr= data_ptr; 
-    assert( header->dwRGBBitCount >= 8 ); 
-    unsigned int pixel_size= header->dwRGBBitCount >> 3; 
-    unsigned int row_pitch= header->dwPitchOrLinearSize; 
-    ~ 
-    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; 
-    } 
-} 
-</code> 
  
 圧縮テクスチャの場合は 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) >> 2) block x 64bit / 8bit = 504byte ( ( 250 + 3) >> 2) block x 64bit / 8bit = 504byte
  
 ただし、圧縮テクスチャの場合も結局 MipmapLevel 毎に同様の block 単位のアライメントサイズの再計算を行う必要があるので、実際の実装ではこのフィールドの値が必要になることがありません。 ただし、圧縮テクスチャの場合も結局 MipmapLevel 毎に同様の block 単位のアライメントサイズの再計算を行う必要があるので、実際の実装ではこのフィールドの値が必要になることがありません。
- 
-同じ理由から、非圧縮の場合も行単位でアライメントされた row_pitch を格納することをお勧めしません。 
-そのまま dwWidth * dwRGBBitCount >> 3 の byte 数を格納した方がよいでしょう。 
- 
- 
- 
  
 ==== dwMipMapCount ==== ==== dwMipMapCount ====
行 145: 行 121:
  
 ただし dwFlags DDSD_MIPMAPCOUNT を正しく判定していないツールやライブラリが存在する可能性があるため、安全のために常に 1 以上の有効な値を入れて置くことをおすすめします。 ただし dwFlags DDSD_MIPMAPCOUNT を正しく判定していないツールやライブラリが存在する可能性があるため、安全のために常に 1 以上の有効な値を入れて置くことをおすすめします。
-また読み出す場合、DDSD_MIPMAPCOUNT が立っていたとしてもこのフィールドが 0 である可能性を考慮した方が良いでしょう。+また読み出す場合、DDSD_MIPMAPCOUNT が立っていたとしてもこのフィールドが 0 である可能性を考慮した方が良いでしょう。
  
 <code cpp> <code cpp>
行 410: 行 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= row_pitch;+    header.dwPitchOrLinearSize= (width * bit_count) >> 3;
 }else{ }else{
     header.dwFlags|= DDSD_LINEARSIZE;     header.dwFlags|= DDSD_LINEARSIZE;
-    header.dwPitchOrLinearSize= (width height bit_count) >> 3;+    header.dwPitchOrLinearSize= (block_width block_height block_bit_count) >> 3;
 } }
  
行 440: 行 417:
     header.dwCaps2|= DDSCAPS2_VOLUME;     header.dwCaps2|= DDSCAPS2_VOLUME;
     header.dwDepth= depth;     header.dwDepth= depth;
 +    header10.Dimension= DDS10_DIMENSION_3D; 
 } }
  
行 451: 行 429:
 if( !isdx10 &&  BitMask 表現可能  ){ if( !isdx10 &&  BitMask 表現可能  ){
     header.dwPfFlags|= DDPF_RGB|DDPF_ALPHAPIXELS;     header.dwPfFlags|= DDPF_RGB|DDPF_ALPHAPIXELS;
-    header.dwRGBBitCount= ..+    header.dwRGBBitCount= bit_count;
     header.dwRBitMask= ..     header.dwRBitMask= ..
     header.dwGBitMask= ..     header.dwGBitMask= ..
行 473: 行 451:
 } }
 </code> </code>
- 
  
  
ddsformat.1432616252.txt.gz · 最終更新: 2015/05/26 13:57 by oga

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki