日別アーカイブ: 2012年8月28日

OpenGL ES 2.0 BGRA Texture を直接読む

OpenGL と Direct3D は Texture の RGB の並びが違っています。
Vista の D3D10 で一度 OpenGL の並び順に統一されましたが
Windows 7 以降、D3D11 で元の Windows 配列が復活しました。

DDS 形式のデータはデフォルトで Windows 順の配列になっています。

Windows : B8 G8 R8 A8
OpenGL  : R8 G8 B8 A8

OpenGL ES 2.0 では BGRA は定義されておらず、Texture Swizzle も
ないので DDS の Texture を読み込む場合は色の並び順を反転させる
必要があります。

並びの違いについて詳しくは下記の記事を参照してください。

OpenGLES2.0 DDS テクスチャを読み込む

ですが結局 GPU としては OpenGL/D3D 両方に対応するものがほとんど
なので、この両者にそれほど違いはありません。
どちらかに決めてしまえばシェーダーでも入れ替えできます。
下記のデータを見ても、PowerVR, Adreno, Tegra は
GL_EXT_texture_format_BGRA8888 に対応していることがわかります。

OpenGL ES Extension (Mobile GPU)

同じ PowerVR でも iOS の場合は GL_EXT_texture_format_BGRA8888
ではなく GL_APPLE_texture_format_BGRA8888 になっています。
どちらも DirectX の Windows 配列のピクセルをそのまま glTexImage2D() に
渡せる点は同じです。でも使い方が少し違います。

Extension        InternalFormat  Format        Type
---------------------------------------------------------------
EXT   BGRA8888   GL_BGRA_EXT     GL_BGRA_EXT   GL_UNSIGNED_BYTE
APPLE BGRA8888   GL_RGBA         GL_BGRA_EXT   GL_UNSIGNED_BYTE

おそらく内部で RGBA 並びに統一した方が効率的にアクセスできるのでしょう。
PowerVR は lowp の swizzle が苦手ということもありますし、
結局ロード時に自分で byte 並びを入れ替えても変わらないかもしれません。

Mali-400MP は GL_EXT_texture_format_BGRA8888 に対応していません。
Extension として GL_ARM_rgba8 がありますが、こちらは Texture ではなく
フレームバッファの並び順です。

関連エントリ
OpenGLES2.0 DDS テクスチャを読み込む