ユーザ用ツール

サイト用ツール


opengl:texturefileformat

差分

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

この比較画面にリンクする

両方とも前のリビジョン 前のリビジョン
次のリビジョン
前のリビジョン
opengl:texturefileformat [2015/07/04 02:35]
oga [Texture File Format]
opengl:texturefileformat [2015/07/04 03:11] (現在)
oga [ASTC]
行 2: 行 2:
  
  
-^ file format  ^  R  ^  RG  ^ RGB  ^ RGBA ^ SRGB  ^ mip  ^ cube ^ volume ^ array  ^  float           ^^^     int          ^^^ S3TC/DXT    ^ 3Dc      ^ BPTC     ^ ATITC   ^ PVRTC        ^^ ETC1    ^  ETC2  ^  ASTC      ^^ +^ file format  ^  R  ^  RG  ^ RGB  ^ RGBA ^ sRGB  ^ mip   ^ cube ^ volume ^ array  ^  float           ^^^     int          ^^^ S3TC/DXT    ^ 3Dc      ^ BPTC     ^ ATITC   ^ PVRTC        ^^ ETC1    ^  ETC2  ^  ASTC      ^^ 
-^  :::         ^ ::: ^  ::: ^ :::  ^ :::  ^ :::   ^ :::  ^ :::  ^  3D    ^  :::    16   ^ 32  ^  64  ^  8    16  ^  32  ^ BC1/BC2/BC3 ^ BC4/BC5  ^ BC6H/BC7 ^ :::      v1    ^ v2   ^ :::      EAC    2D  ^  3D  ^ +^  :::         ^ ::: ^  ::: ^ :::  ^ :::  ^ :::   ^ :::   ^ :::  ^  3D    ^  :::    16   ^ 32  ^  64  ^  8    16  ^  32  ^ BC1/BC2/BC3 ^ BC4/BC5  ^ BC6H/BC7 ^ :::      v1    ^ v2   ^ :::      EAC    2D  ^  3D  ^ 
-| DDS (.dds)    Y  |  Y    Y    Y    Y    |  Y   |  Y    Y      Y(e)  |  Y    |  Y  |  -    Y    Y    Y    Y          |        |        |  y(a)    y(b)  |  -    y(a)        |  Y    -   | +| DDS (.dds)    Y  |  Y    Y    Y    Y    |  Y    |  Y    Y      Y(d)  |  Y    |  Y  |  -    Y    Y    Y    Y          |        |        |  y(a)    y(b)  |  -    y(a)        |  Y    -   | 
-| KTX (.ktx)    Y  |  Y    Y    Y    Y    |  Y   |  Y    Y      Y      Y    |  Y  |  Y    Y    Y    Y    Y          |        |        |  Y      |  Y      Y    Y      |      |  Y    -   | +| KTX (.ktx)    Y  |  Y    Y    Y    Y    |  Y    |  Y    Y      Y      Y    |  Y  |  Y    Y    Y    Y    Y          |        |        |  Y      |  Y      Y    Y      |      |  Y    -   | 
-| PVR (.pvr)    Y  |  Y    Y    Y    Y    |  Y   |  Y    Y      Y      Y    |  Y  |  -    Y    Y    Y    Y          |        |        |  -      |  Y      Y    Y      |      |  Y    -   | +| PVR (.pvr)    Y  |  Y    Y    Y    Y    |  Y    |  Y    Y      Y      Y    |  Y  |  -    Y    Y    Y    Y          |        |        |  -      |  Y      Y    Y      |      |  Y    -   | 
-| PKM (.pkm)            |      |      |  -    |  Y   |  -    -      -      -    |  -  |  -    -    -    -    -          |        |  -        -      |  -      -    Y      |      |  -    -   | +| PKM (.pkm)            |      |      |  -    |  y(e) |  -    -      -      -    |  -  |  -    -    -    -    -          |        |  -        -      |  -      -    Y      |      |  -    -   | 
-| ASTC (.astc) |          |      |      |  -    |  -   |  -    y<nowiki>(c)</nowiki>   |  y(d) |  -  |  -  |  -  |  -  |  -  |  -  |      |  -        -      |  -      -    -      |      |  Y    Y   |+| ASTC (.astc) |          |      |      |  -    |  -    |  -    y(f)  |  -     |  -    |  -  |  -   |  -   |  -   |  -   |  -          |        |  -        -      |  -      -    -      |      |  Y    Y   | 
  
   * (a) = Qualcomm(ATI) のコンバータが FourCC を使って格納。おそらく独自仕様。元は Direct3DM 向け。Array 不可   * (a) = Qualcomm(ATI) のコンバータが FourCC を使って格納。おそらく独自仕様。元は Direct3DM 向け。Array 不可
   * (b) = PVRTC 独自仕様。FourCC で格納。Array 不可   * (b) = PVRTC 独自仕様。FourCC で格納。Array 不可
-  * <nowiki>(c)</nowiki> ASTC の 3D BLOCK 圧縮のみ格納可能。 +  * (d) = DXGI_FORMAT 表現可能なフォーマットのみ Array を格納可能。DX10 拡張ヘッダ必須。 
-  * (d) = ASTC HDR の fp16 のみ格納可能。 +  * (e) = ETC1 のみ格納可能。 
-  * (e) = DXGI_FORMAT 表現可能なフォーマットのみ Array を格納可能。D3D10 拡張ヘッダ必須+  * (f) = ASTC の 3D BLOCK 圧縮のみ格納可能。
  
  
行 23: 行 24:
   * DXT1 等の圧縮テクスチャの格納   * DXT1 等の圧縮テクスチャの格納
   * R, RG, RGB, RGBA 等の、1~4 任意コンポーネントの格納   * R, RG, RGB, RGBA 等の、1~4 任意コンポーネントの格納
-  * SRGB / Linear の区別+  * sRGB / Linear の区別
  
  
行 31: 行 32:
 DirectX7 以前の DirectDrawSurface 構造をそのままファイルに書き込んだもの。 DirectX7 以前の DirectDrawSurface 構造をそのままファイルに書き込んだもの。
 Realtime 3D のテクスチャ画像形式としては非常に扱いやすく、対応ツールも多いのでほぼ標準として使われています。 Realtime 3D のテクスチャ画像形式としては非常に扱いやすく、対応ツールも多いのでほぼ標準として使われています。
 +[[:ddsformat|詳細は下記ページ]]よりどうぞ。
  
   * [[:ddsformat|DDS フォーマットの詳細解説]]   * [[:ddsformat|DDS フォーマットの詳細解説]]
行 37: 行 39:
   * [[:ddstexture|DDS 作成方法]]   * [[:ddstexture|DDS 作成方法]]
  
-ヘッダサイズは 128byte 固定。D3D10 情報が含まれる場合は 20byte 増えて 148byte 固定。可変長エリアがなく扱いが容易です。+ヘッダサイズは 128byte 固定。DX10 情報が含まれる場合は 20byte 増えて 148byte 固定。可変長エリアがなく扱いが容易です。
 littleendian 固定です。 littleendian 固定です。
  
行 48: 行 50:
   * FourCC で容易に新規フォーマット対応ができる   * FourCC で容易に新規フォーマット対応ができる
   * 古くから用いられており非常に多くのツールが対応している   * 古くから用いられており非常に多くのツールが対応している
-  * ヘッダ長が固定で読み込みが容易+  * ヘッダ長が固定で読み込みが容易 (DX10 拡張ヘッダの導入によりヘッダサイズは必ずしも固定ではなく 2 種類に増えました)
  
 逆に言えばこれらの特徴を満たす画像フォーマットが他に存在しませんでした。 逆に言えばこれらの特徴を満たす画像フォーマットが他に存在しませんでした。
行 54: 行 56:
 欠点は下記の通り。 欠点は下記の通り。
  
-  * D3D10 でフォーマットが拡張されたが古いツールやライブラリで読み込むことができない +  * Direct3D 10 でフォーマットが拡張されたが古いツールやライブラリで読み込むことができない。逆に新しいツールでは DX10 拡張ヘッダがないと読み込めないものもある。 
-  * OpenGL で追加された新しい圧縮テクスチャに対応できない+  * OpenGL で追加された新しい圧縮テクスチャに対応できない
   * ヘッダ構造がゆるく冗長性を含んでいるため、ツールによってヘッダ情報にゆらぎがある。ツールによっては読み込めないフォーマットあり。   * ヘッダ構造がゆるく冗長性を含んでいるため、ツールによってヘッダ情報にゆらぎがある。ツールによっては読み込めないフォーマットあり。
-  * DXGI_FORMAT で表現できないフォーマットは D3D10 拡張ヘッダを使うことができないため、Array にできない+  * DXGI_FORMAT で表現できないフォーマットは DX10 拡張ヘッダを使うことができないため、Array にできない
  
  
行 86: 行 88:
 特徴は、OpenGL / OpenGL ES の定義されたフォーマットシンボル値をそのまま格納することです。 特徴は、OpenGL / OpenGL ES の定義されたフォーマットシンボル値をそのまま格納することです。
 例えば GL_UNSIGNED_SHORT_5_6_5 や GL_COMPRESSED_RGB_S3TC_DXT1_EXT や GL_COMPRESSED_RGB8_ETC2 など。 例えば GL_UNSIGNED_SHORT_5_6_5 や GL_COMPRESSED_RGB_S3TC_DXT1_EXT や GL_COMPRESSED_RGB8_ETC2 など。
-特に ASTC を用いる場合は現状では KTX 一択です。 
  
 今後対応ツールが増えれば、KTX は標準フォーマットとして用いられるようになるかもしれません。 今後対応ツールが増えれば、KTX は標準フォーマットとして用いられるようになるかもしれません。
行 96: 行 97:
   * ヘッダに GL の定義値をそのまま格納するので、テクスチャローダーは OpenGL API に渡すだけで良い   * ヘッダに GL の定義値をそのまま格納するので、テクスチャローダーは OpenGL API に渡すだけで良い
   * あとから OpenGL に追加された新しいフォーマットにも即対応できる。ツールやローダーの修正なしに用いることができる   * あとから OpenGL に追加された新しいフォーマットにも即対応できる。ツールやローダーの修正なしに用いることができる
-  * DDS が対応していない ETC2/EAC/ASTC を格納できる+  * DDS が対応していない ETC2/EAC など新しいフォーマット即座に格納できる
   * 画像毎に byte size が挿入されるためツールが対応しやすい   * 画像毎に byte size が挿入されるためツールが対応しやすい
  
行 106: 行 107:
   * 画像の前に 32bit の情報 (データサイズ) が必ず挿入されるため、アライメント整合が取りにくい。   * 画像の前に 32bit の情報 (データサイズ) が必ず挿入されるため、アライメント整合が取りにくい。
   * 上位互換フォーマットはヘッダのシンボル値をそのまま使ってロードできない場合がある。(ETC2 として ETC1 をロードする場合に問題が発生)   * 上位互換フォーマットはヘッダのシンボル値をそのまま使ってロードできない場合がある。(ETC2 として ETC1 をロードする場合に問題が発生)
 +  * OpenGL 以外のプラットフォームでは扱いづらい。
  
  
行 121: 行 123:
 </code> </code>
  
 +
 +<code cpp>
 +enum {
 +    KTX_HEADER_MAGIC0     0x58544bab,
 +    KTX_HEADER_MAGIC1     0xbb313120,
 +    KTX_HEADER_MAGIC2     0x0a1a0a0d,
 +    KTX_HEADER_ENDIAN     0x04030201,
 +};
 +
 +struct T_KTXHEADER {       // 64byte
 +    UI32    Identifier[3];
 +    UI32    endianness;             // 0x04030201
 +    UI32    glType;                 // 0: compressed
 +    UI32    glTypeSize;             // 1: compressed
 +    UI32    glFormat;               // 0: compressed
 +    UI32    glInternalFormat;       // Compressed Format
 +    UI32    glBaseInternalFormat;
 +    UI32    pixelWidth;
 +    UI32    pixelHeight;            // == 0 1D texture
 +    UI32    pixelDepth;             // == 0 2D texture
 +    UI32    numberOfArrayElements;
 +    UI32    numberOfFaces;          // +X,-X,+Y,-Y,+Z,-Z
 +    UI32    numberOfMipmapLevels;   // > 1
 +    UI32    bytesOfKeyValueData;    // metadata
 +public:
 +    bool IsCompressed() const
 +    {
 +        return  glType == 0;
 +    }
 +};
 +</code>
  
  
行 142: 行 175:
     * PVRTC-2 対応     * PVRTC-2 対応
     * データ並びが KTX 順     * データ並びが KTX 順
 +
 +<code cpp>
 +struct T_PVR3HEADER {   // 13x4 = 52
 +    unsigned int    Version;        // 'PVR' 0x03
 +    unsigned int    Flags;
 +    unsigned int    PixelFormat[2]; // ('argb',08080808) or (PVR3_FORMAT_*,00000000)
 +    unsigned int    ColorSpace;
 +    unsigned int    ChannelType;    // PVR3_CHANNELTYPE_
 +    unsigned int    Height;
 +    unsigned int    Width;
 +    unsigned int    Depth;          // >=1
 +    unsigned int    Surfaces;       // >=1 texture array
 +    unsigned int    Faces;          // >=1 cubemap
 +    unsigned int    MipMapCount;    // >=1
 +    unsigned int    MetaDataSize;
 +};
 +</code>
  
 <code> <code>
行 153: 行 203:
     * PVRTC-2 非対応     * PVRTC-2 非対応
     * データ並びが DDS 順     * データ並びが DDS 順
 +
 +
  
 <code> <code>
 ( ( ( width * height ) * mip ) * [cube_face or volume_depth] ) ( ( ( width * height ) * mip ) * [cube_face or volume_depth] )
 +</code>
 +
 +
 +<code cpp>
 +struct T_PVR2HEADER {
 +    unsigned int    hsize;      // == 52 == sizeof(T_PVR2HEADER)
 +    unsigned int    height;
 +    unsigned int    width;
 +    unsigned int    miplevel;   // mipcount-1 (0=single plane)
 +    unsigned int    tformat;    // 0x10 0x08 0x01  bit0-7=PVR2_FORMAT_, bit8-31= PVR2_FLAG_
 +    unsigned int    datasize;   // byte size (one surface size)
 +    unsigned int    bpp;        // bpp
 +    unsigned int    redmask;    // RedMask
 +    unsigned int    greenmask;  // GreenMask
 +    unsigned int    bluemask;   // BlueMask
 +    unsigned int    alphamask;  // AlphaMask
 +    unsigned int    magic;      // == 0x21525650  "PVR!"
 +    unsigned int    depth;      // surfaces (volume or cube)
 +};
 </code> </code>
  
行 179: 行 250:
  
 <code> <code>
-version 1.0+version 1.0  (header.version == 10)
 type: 0=ETC1-RGB, 1=ETC1-RGBA, 2=ETC1-RGB-MIP, 3=ETC1-RGBA-MIP type: 0=ETC1-RGB, 1=ETC1-RGBA, 2=ETC1-RGB-MIP, 3=ETC1-RGBA-MIP
  
-version 2.0+version 2.0  (header.version == 20)
 type: 0=ETC1_RGB, 1=ETC2_RGB, 2=ETC2_RGBA_OLD, 3=ETC2_RGBA, 4=ETC2_RGBA1, 5=ETC2_R, 6=ETC2_RG, 7=ETC2_SIGNED_R, 8=ETC2_SIGNED_RG type: 0=ETC1_RGB, 1=ETC2_RGB, 2=ETC2_RGBA_OLD, 3=ETC2_RGBA, 4=ETC2_RGBA1, 5=ETC2_R, 6=ETC2_RG, 7=ETC2_SIGNED_R, 8=ETC2_SIGNED_RG
 </code> </code>
行 212: 行 283:
  
  
 +
 +===== 更新 =====
 +
 +  * 2015/07/04 : 表を更新、ASTC format 追加、ktx, pvr の header 構造を追加。
  
  
opengl/texturefileformat.1435944932.txt.gz · 最終更新: 2015/07/04 02:35 by oga