iPhoneでGL_TEXTURE_MAG_FILTER
が効かない?
iPhoneのOpenGLにて、小さいテクスチャを拡大して描画する時の話です。テクスチャの描画にはglDrawTexiOES
を使っていて、線形補完はナシ、つまりGL_NEAREST
で描画したかったのです。
GL_TEXTURE_MIN_FILTER
およびGL_TEXTURE_MAG_FILTER
はこのように指定しました。
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
つまり、縮小時は線形補完、拡大時は最近傍描画というわけです。これで3*5ピクセルの小さいテクスチャを100倍くらいで描画した結果がこれ。
iPhone シミュレーター
iPod touch
ご覧の通りiPhone シミュレーターは補完なしで希望通り描画されていますが、iPod touchではバリ線形補完かかっちゃってます。カコワルイ( ・∀・)
そこで今度は両方にGL_NEAREST
を指定してみました。つまりこんな感じ。
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
するとあら不思議、iPod touch上でもちゃんと希望通り描画されました。実機ではGL_TEXTURE_MIN_FILTER
が拡大もかねてるんですかね?
よくわかりませんがうまく出来たのでよしとします。iPod touchしか持ってないのでiPhoneでどうなるかわかりませんが、そんな細かいところに違いがあるとも思えないのできっと同じでしょう。さすがにiPhone 3GSでは挙動が違うでしょうけども。
それにしてもOpenGLで描画してみると、iPhoneが意外と非力なのにびっくりします。すごいグラフィックのゲームがいっぱいあるのでパワーがあるのかと思いきや、みんなちゃんとプログラムで最適化がんがんかけてるんですねーきっと。GL_BLENDを極力使わないとか、glBindTextureを最小限にするとかは基本ですかね。シミュレーターで作ってから実機に転送したら遅くて使い物にならなかったり、あー苦手苦手。そういうのまとめた本ないかな……
この記事はここで終わりです。
読んでいただきありがとうございました。
良かったらシェアしてね!
That's all for this article. Thank you for your reading.
Please share this if you like it!