3D技術研究所Wiki > テクスチャ > DDS画像フォーマット詳細

※準備中です

DDS画像フォーマットの詳細をまとめています。

情報

このページはDDS画像フォーマットの詳細について解説しています。
ご自身のアプリケーションにDDS画像を組み込みたい場合はDDSReaderをご覧ください。

目次


DDS画像ヘッダー詳細

※準備中です

オフセット(Byte)長さ(Byte)説明
04識別子'D' 'D' 'S' ' 'の順に並んでいます
44ヘッダー構造体サイズ(124固定)
84フラグ
124画像の高さ
164画像の幅
2041ライン当たりのバイト数
244ボリュームテクスチャ深度
284ミップマップ数
3244リザーブ領域(44byte), 使われません
7632ピクセルフォーマット構造体
764ピクセルフォーマット構造体サイズ(32固定)
804ピクセルフォーマットフラグ
844FourCC
884RGBビットカウント
924赤成分ビットマスク
964緑成分ビットマスク
1004青成分ビットマスク
1044アルファ成分ビットマスク
1084caps1, 主にテクスチャ設定
1124caps2, 主にキューブマップやボリュームテクスチャの設定
1164caps3, 使われません
1204caps4, 使われません
1244リザーブ領域, 使われません
128...データ部開始
ピクセルフォーマットフラグ説明
0x01アルファを含みます(アルファビットマスクが有効)
0x04圧縮されたデータを含みます(FourCCが有効)
0x40RGBフォーマット
0x200YUVフォーマット
0x20000Luminanceフォーマット

画像フォーマットに依存せずに共通で使う重要な項目は画像の高さ, 画像の幅, ミップマップ数です。
それぞれの項目を取り出すサンプルコードは以下の通りです。

1
2
3
4
5
6
7
8
9
10
11
public static int getHeight(byte [] buffer) {
    return (buffer[12] & 0xFF) | (buffer[13] & 0xFF) << 8 | (buffer[14] & 0xFF) << 16 | (buffer[15] & 0xFF) << 24;
}

public static int getWidth(byte [] buffer) {
    return (buffer[16] & 0xFF) | (buffer[17] & 0xFF) << 8 | (buffer[18] & 0xFF) << 16 | (buffer[19] & 0xFF) << 24;
}

public static int getMipmap(byte [] buffer) {
    return (buffer[28] & 0xFF) | (buffer[29] & 0xFF) << 8 | (buffer[30] & 0xFF) << 16 | (buffer[31] & 0xFF) << 24;
}

DDS画像データ詳細

※準備中です
DDS画像のフォーマットの中でRGBフォーマットとDXT圧縮フォーマットを解説します。
他のフォーマットはDDSReaderで対応した時に解説する予定です。

DDS画像のデータがどのように格納されているかはピクセルフォーマットフラグを参照します。

1
2
3
public static int getPixelFormatFlags(byte [] buffer) {
    return (buffer[80] & 0xFF) | (buffer[81] & 0xFF) << 8 | (buffer[82] & 0xFF) << 16 | (buffer[83] & 0xFF) << 24;
}

RGBフォーマット詳細

※準備中です
RGBフォーマットは赤成分、緑成分、青成分、アルファ成分が並んでいる非圧縮のシンプルなフォーマットです。

RGBフォーマットを判定するサンプルコード

1
2
3
4
5
int flags = getPixelFormatFlags(buffer);

if((flags & 0x40) != 0) {
    // RGBフォーマット
}

RGBフォーマットかどうか判定できたらRGB(A)のビット数と各成分のマスクを取り出します。
アルファマスクはRGBフォーマットがアルファを含むかどうか判定します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public static int getBitCount(byte [] buffer) {
    return (buffer[88] & 0xFF) | (buffer[89] & 0xFF) << 8 | (buffer[90] & 0xFF) << 16 | (buffer[91] & 0xFF) << 24;
}

public static int getRedMask(byte [] buffer) {
    return (buffer[92] & 0xFF) | (buffer[93] & 0xFF) << 8 | (buffer[94] & 0xFF) << 16 | (buffer[95] & 0xFF) << 24;
}

public static int getGreenMask(byte [] buffer) {
    return (buffer[96] & 0xFF) | (buffer[97] & 0xFF) << 8 | (buffer[98] & 0xFF) << 16 | (buffer[99] & 0xFF) << 24;
}

public static int getBlueMask(byte [] buffer) {
    return (buffer[100] & 0xFF) | (buffer[101] & 0xFF) << 8 | (buffer[102] & 0xFF) << 16 | (buffer[103] & 0xFF) << 24;
}

public static int getAlphaMask(byte [] buffer) {
    return (buffer[104] & 0xFF) | (buffer[105] & 0xFF) << 8 | (buffer[106] & 0xFF) << 16 | (buffer[107] & 0xFF) << 24;
}

RGBフォーマットを判定してビット数と各成分のマスクを取得するサンプルコード

1
2
3
4
5
6
7
8
9
10
int flags = getPixelFormatFlags(buffer);

if((flags & 0x40) != 0) {
    // RGBフォーマット
    int bitCount = getBitCount(buffer);
    int redMask = getRedMask(buffer);
    int greenMask = getGreenMask(buffer);
    int blueMask = getBlueMask(buffer);
    int alphaMask = ((flags&0x01) != 0) ? getAlphaMask(buffer) : 0; // 0x01 alpha
}

ビット数で分岐するサンプルコード

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int bitCount = getBitCount(buffer);

if(bitCount == 16) {
    // 16bit RGBフォーマット
    // 例 R5G6B5, A4R4G4B4, ...
}
else if(bitCount == 24) {
    // 24bit RGBフォーマット
    // 例 R8G8B8
}
else if(bitCount == 32) {
    // 32bit RGBフォーマット
    // 例 A8R8G8B8, X8B8G8R8, ...
}
else {
    // その他の RGBフォーマット
}

最終的なRGBフォーマット判定方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
int flags = getPixelFormatFlags(buffer);

if((flags & 0x40) != 0) {
    // RGBフォーマット
    int bitCount = getBitCount(buffer);
    int redMask = getRedMask(buffer);
    int greenMask = getGreenMask(buffer);
    int blueMask = getBlueMask(buffer);
    int alphaMask = ((flags&0x01) != 0) ? getAlphaMask(buffer) : 0; // 0x01 alpha

    if(bitCount == 16) {
        // 16bit RGBフォーマット
        // R5G6B5のビットマスクはRGBAの順に 0xF800, 0x07E0, 0x001F, 0x0000
        if(redMask == 0xF800 && greenMask == 0x07E0 && blueMask == 0x001F && alphaMask == 0x0000) {
            // 16bit R5G6B5 RGBフォーマット!
        }
    }
    else if(bitCount == 24) {
        // 24bit RGBフォーマット
        // R8G8B8のビットマスクはRGBAの順に 0xFF0000, 0x00FF00, 0x0000FF, 0x000000
        if(redMask == 0xFF0000 && greenMask == 0x00FF00 && blueMask == 0x0000FF && alphaMask == 0x000000) {
            // 24bit R8G8B8 RGBフォーマット!
        }
    }
    else if(bitCount == 32) {
        // 32bit RGBフォーマット
        // A8R8G8B8のビットマスクはRGBAの順に 0x00FF0000, 0x0000FF00, 0x000000FF, 0xFF000000
        if(redMask == 0x00FF0000 && greenMask == 0x0000FF00 && blueMask == 0x000000FF && alphaMask == 0xFF000000) {
            // 32bit A8R8G8B8 RGBフォーマット!
        }
    }
    else {
        // その他の RGBフォーマット
    }
}

DXT圧縮フォーマット詳細

※準備中です
DXT圧縮フォーマットはDXTC(S3TC)圧縮されたデータフォーマットです。
DXT圧縮フォーマットに共通することは 幅4ピクセル x 高さ4ピクセル で圧縮することです。
例えば 1x1, 2x2, 3x3, 4x4 ピクセルのDXT圧縮画像はどれも同じサイズになります。

DXT圧縮フォーマットを判定するサンプルコード

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
private static final int DXT1 = (0x44585431); // 'D' 'X' 'T' '1'
private static final int DXT2 = (0x44585432); // 'D' 'X' 'T' '2'
private static final int DXT3 = (0x44585433); // 'D' 'X' 'T' '3'
private static final int DXT4 = (0x44585434); // 'D' 'X' 'T' '4'
private static final int DXT5 = (0x44585435); // 'D' 'X' 'T' '5'

int flags = getPixelFormatFlags(buffer);
if((flags & 0x04) != 0) {
    // FourCCが有効
    int fourcc = getFourCC(buffer);
    switch(fourCC) {
    case DXT1: /* DXT1 */ break;
    case DXT2: /* DXT2 */ break;
    case DXT3: /* DXT3 */ break;
    case DXT4: /* DXT4 */ break;
    case DXT5: /* DXT5 */ break;
    }
}

DXT1圧縮フォーマット詳細

※準備中です

DXT3圧縮フォーマット詳細

※準備中です

DXT5圧縮フォーマット詳細

※準備中です

DDS画像ミップマップ詳細

※準備中です

DDS画像ソースコード

こちらをご覧ください。

Java

https://github.com/npedotnet/DDSReader/blob/master/src/java/DDSReader.java

C

https://github.com/npedotnet/DDSReader/blob/master/src/c/dds_reader.h
https://github.com/npedotnet/DDSReader/blob/master/src/c/dds_reader.c


関連ページ


スポンサードリンク

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS