opengl:texturefileformat
差分
このページの2つのバージョン間の差分を表示します。
両方とも前のリビジョン前のリビジョン次のリビジョン | 前のリビジョン次のリビジョン両方とも次のリビジョン | ||
opengl:texturefileformat [2015/07/04 02:38] – [Texture File Format] oga | opengl:texturefileformat [2015/07/04 03:03] – [PKM] oga | ||
---|---|---|---|
行 2: | 行 2: | ||
- | ^ file format | + | ^ file format |
^ ::: ^ ::: ^ ::: ^ ::: ^ ::: ^ ::: ^ ::: ^ ::: ^ 3D ^ ::: | ^ ::: ^ ::: ^ ::: ^ ::: ^ ::: ^ ::: ^ ::: ^ ::: ^ 3D ^ ::: | ||
| DDS (.dds) | | DDS (.dds) | ||
行 22: | 行 22: | ||
* DXT1 等の圧縮テクスチャの格納 | * DXT1 等の圧縮テクスチャの格納 | ||
* R, RG, RGB, RGBA 等の、1~4 任意コンポーネントの格納 | * R, RG, RGB, RGBA 等の、1~4 任意コンポーネントの格納 | ||
- | * SRGB / Linear の区別 | + | * sRGB / Linear の区別 |
行 30: | 行 30: | ||
DirectX7 以前の DirectDrawSurface 構造をそのままファイルに書き込んだもの。 | DirectX7 以前の DirectDrawSurface 構造をそのままファイルに書き込んだもの。 | ||
Realtime 3D のテクスチャ画像形式としては非常に扱いやすく、対応ツールも多いのでほぼ標準として使われています。 | Realtime 3D のテクスチャ画像形式としては非常に扱いやすく、対応ツールも多いのでほぼ標準として使われています。 | ||
+ | [[: | ||
* [[: | * [[: | ||
行 36: | 行 37: | ||
* [[: | * [[: | ||
- | ヘッダサイズは 128byte 固定。D3D10 情報が含まれる場合は 20byte 増えて 148byte 固定。可変長エリアがなく扱いが容易です。 | + | ヘッダサイズは 128byte 固定。DX10 情報が含まれる場合は 20byte 増えて 148byte 固定。可変長エリアがなく扱いが容易です。 |
littleendian 固定です。 | littleendian 固定です。 | ||
行 47: | 行 48: | ||
* FourCC で容易に新規フォーマット対応ができる | * FourCC で容易に新規フォーマット対応ができる | ||
* 古くから用いられており非常に多くのツールが対応している | * 古くから用いられており非常に多くのツールが対応している | ||
- | * ヘッダ長が固定で読み込みが容易 | + | * ヘッダ長が固定で読み込みが容易 |
逆に言えばこれらの特徴を満たす画像フォーマットが他に存在しませんでした。 | 逆に言えばこれらの特徴を満たす画像フォーマットが他に存在しませんでした。 | ||
行 53: | 行 54: | ||
欠点は下記の通り。 | 欠点は下記の通り。 | ||
- | * D3D10 でフォーマットが拡張されたが古いツールやライブラリで読み込むことができない | + | * Direct3D 10 でフォーマットが拡張されたが古いツールやライブラリで読み込むことができない。逆に新しいツールでは DX10 拡張ヘッダがないと読み込めないものもある。 |
- | * OpenGL で追加された新しい圧縮テクスチャに対応できない | + | * OpenGL で追加された新しい圧縮テクスチャに対応できない。 |
* ヘッダ構造がゆるく冗長性を含んでいるため、ツールによってヘッダ情報にゆらぎがある。ツールによっては読み込めないフォーマットあり。 | * ヘッダ構造がゆるく冗長性を含んでいるため、ツールによってヘッダ情報にゆらぎがある。ツールによっては読み込めないフォーマットあり。 | ||
- | * DXGI_FORMAT で表現できないフォーマットは | + | * DXGI_FORMAT で表現できないフォーマットは |
行 85: | 行 86: | ||
特徴は、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 は標準フォーマットとして用いられるようになるかもしれません。 | ||
行 95: | 行 95: | ||
* ヘッダに GL の定義値をそのまま格納するので、テクスチャローダーは OpenGL API に渡すだけで良い | * ヘッダに GL の定義値をそのまま格納するので、テクスチャローダーは OpenGL API に渡すだけで良い | ||
* あとから OpenGL に追加された新しいフォーマットにも即対応できる。ツールやローダーの修正なしに用いることができる | * あとから OpenGL に追加された新しいフォーマットにも即対応できる。ツールやローダーの修正なしに用いることができる | ||
- | * DDS が対応していない ETC2/EAC/ASTC を格納できる | + | * DDS が対応していない ETC2/ |
* 画像毎に byte size が挿入されるためツールが対応しやすい | * 画像毎に byte size が挿入されるためツールが対応しやすい | ||
行 105: | 行 105: | ||
* 画像の前に 32bit の情報 (データサイズ) が必ず挿入されるため、アライメント整合が取りにくい。 | * 画像の前に 32bit の情報 (データサイズ) が必ず挿入されるため、アライメント整合が取りにくい。 | ||
* 上位互換フォーマットはヘッダのシンボル値をそのまま使ってロードできない場合がある。(ETC2 として ETC1 をロードする場合に問題が発生) | * 上位互換フォーマットはヘッダのシンボル値をそのまま使ってロードできない場合がある。(ETC2 として ETC1 をロードする場合に問題が発生) | ||
+ | * OpenGL 以外のプラットフォームでは扱いづらい。 | ||
行 120: | 行 121: | ||
</ | </ | ||
+ | |||
+ | <code cpp> | ||
+ | enum { | ||
+ | KTX_HEADER_MAGIC0 | ||
+ | KTX_HEADER_MAGIC1 | ||
+ | KTX_HEADER_MAGIC2 | ||
+ | KTX_HEADER_ENDIAN | ||
+ | }; | ||
+ | |||
+ | struct T_KTXHEADER { // 64byte | ||
+ | UI32 Identifier[3]; | ||
+ | UI32 endianness; | ||
+ | UI32 glType; | ||
+ | UI32 glTypeSize; | ||
+ | UI32 glFormat; | ||
+ | UI32 glInternalFormat; | ||
+ | UI32 glBaseInternalFormat; | ||
+ | UI32 pixelWidth; | ||
+ | UI32 pixelHeight; | ||
+ | UI32 pixelDepth; | ||
+ | UI32 numberOfArrayElements; | ||
+ | UI32 numberOfFaces; | ||
+ | UI32 numberOfMipmapLevels; | ||
+ | UI32 bytesOfKeyValueData; | ||
+ | public: | ||
+ | bool IsCompressed() const | ||
+ | { | ||
+ | return | ||
+ | } | ||
+ | }; | ||
+ | </ | ||
行 141: | 行 173: | ||
* PVRTC-2 対応 | * PVRTC-2 対応 | ||
* データ並びが KTX 順 | * データ並びが KTX 順 | ||
+ | |||
+ | <code cpp> | ||
+ | struct T_PVR3HEADER { // 13x4 = 52 | ||
+ | unsigned int Version; | ||
+ | unsigned int Flags; | ||
+ | unsigned int PixelFormat[2]; | ||
+ | unsigned int ColorSpace; | ||
+ | unsigned int ChannelType; | ||
+ | unsigned int Height; | ||
+ | unsigned int Width; | ||
+ | unsigned int Depth; | ||
+ | unsigned int Surfaces; | ||
+ | unsigned int Faces; | ||
+ | unsigned int MipMapCount; | ||
+ | unsigned int MetaDataSize; | ||
+ | }; | ||
+ | </ | ||
< | < | ||
行 152: | 行 201: | ||
* PVRTC-2 非対応 | * PVRTC-2 非対応 | ||
* データ並びが DDS 順 | * データ並びが DDS 順 | ||
+ | |||
+ | |||
< | < | ||
( ( ( width * height ) * mip ) * [cube_face or volume_depth] ) | ( ( ( width * height ) * mip ) * [cube_face or volume_depth] ) | ||
+ | </ | ||
+ | |||
+ | |||
+ | <code cpp> | ||
+ | struct T_PVR2HEADER { | ||
+ | unsigned int hsize; | ||
+ | unsigned int height; | ||
+ | unsigned int width; | ||
+ | unsigned int miplevel; | ||
+ | unsigned int tformat; | ||
+ | unsigned int datasize; | ||
+ | unsigned int bpp; // bpp | ||
+ | unsigned int redmask; | ||
+ | unsigned int greenmask; | ||
+ | unsigned int bluemask; | ||
+ | unsigned int alphamask; | ||
+ | unsigned int magic; | ||
+ | unsigned int depth; | ||
+ | }; | ||
</ | </ | ||
行 178: | 行 248: | ||
< | < | ||
- | version 1.0 | + | version 1.0 |
type: 0=ETC1-RGB, 1=ETC1-RGBA, | type: 0=ETC1-RGB, 1=ETC1-RGBA, | ||
- | version 2.0 | + | version 2.0 |
type: 0=ETC1_RGB, 1=ETC2_RGB, 2=ETC2_RGBA_OLD, | type: 0=ETC1_RGB, 1=ETC2_RGB, 2=ETC2_RGBA_OLD, | ||
</ | </ |
opengl/texturefileformat.txt · 最終更新: 2015/07/04 03:11 by oga