読者です 読者をやめる 読者になる 読者になる

eaglesakuraの技術ブログ

twitterから派生した、技術的にちょっと込み入った話題とか。

Galaxy NexusでETC1テクスチャを利用する場合の注意

OpenGL Android

ETC1とGalaxy Nexus

AndroidOpenGL ES実装はETC1をサポートするようになっています。

ETC1テクスチャは4x4のピクセルブロックを基本とした圧縮を行うため、利用するには次のような制限があります。

  • 縦横のピクセル数が4の倍数であること
    • そのため、Android SDK付属のetc1toolを利用すると4で割り切れるように画像末尾に詰め物を入れられる
  • GL_OES_compressed_ETC1_RGB8_textureエクステンション対応のGPUであること

この制限に従っていれば、Power Of Two(2のn乗)である必要はありません。

Galaxy NexusのGPUはスペック上はnpot(Non Power Of Two = 2のn乗以外)テクスチャも扱えますし、ETC1もサポートしています。

f:id:eaglesakura:20130317155132j:plain

f:id:eaglesakura:20130317155228j:plain

当然、次のコマンドも正常に行えますし、assertも通過します。

glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_ETC1_RGB8_OES, width, height, 0, image_bytes, image);
assert(glGetError() == GL_NO_ERROR);

その状態でテクスチャをbindしてレンダリングすると、問答無用でアプリが落ちます。OpenGLは基本的にエラーが発生したらエラーをセットするだけのため、異常な動作だと思われます。

解決方法としては「npotのETC1を使わない」という点ですが、でっかい背景画像とかnpotのETC1を使いたい場所はそこそこあるので、他の端末で同様の不具合が起きないことを祈るのみです。

その他

回避方法、もしくは「ここが間違ってる」という指摘があったらコメントお願いしますm(__)m

初めてのOpenGL ES

初めてのOpenGL ES