Unity のスプライトや、ゲーム開発においての初心者あるある。
主に2Dゲーを作ろうとしたときに、スプライトの端に隣のテクセルが見切れてしまうような現象に出会ってしまった場合、
テクスチャのサイズをPOW2(2累乗サイズ)にしていないかを確認しよう。
1 / 2 / 4 / 8 / 16 / 32 / 64 / 128 / 256 / 512 / 1024 / 2048 / 4096 など
POW2のサイズに余白を足してでもテクスチャを広げてみよう。
浮動小数が割り切れる数になるため、端数がでて変な見切れは発生しなくなる。
iOS で glBindTexture glGenTextures などテクスチャ系処理が 0x502 (GL_INVALID_OPERATION) を出す
今回は、UIView の init 系で処理をすると、
コンテキストが正しく認識されず、 OpenGL がちゃんと初期化されていない事で起こっていた。
なぜか gl****Texture 系のみで、他の設定系はエラーが出ていなかったので迷ってしまった。
これが原因で、glDraw 系は EXC_BAD_ACCESS で止まる。
結論として、layoutSubviews の中で OpenGL を初期化するようにしたら直った。
コンテキストが正しく認識されず、 OpenGL がちゃんと初期化されていない事で起こっていた。
なぜか gl****Texture 系のみで、他の設定系はエラーが出ていなかったので迷ってしまった。
これが原因で、glDraw 系は EXC_BAD_ACCESS で止まる。
結論として、layoutSubviews の中で OpenGL を初期化するようにしたら直った。
OpenGLES2.0 のあれこれメモ
iOS6のiPhone4で確認しているので、iPhone4をミニマムスペックとしている人用のメモです。
iPhone4より性能がいい端末は、ここまで気を遣わなくてもいいはず‥。
・InstrumentsでOpenGL解析を使用して毎フレーム警告がでる部分は
解消すればそれなりに処理時間も改善されている模様。
・Mipmapは1.1同様、2の累乗サイズでしか作成できない。
必要ないならデフォルトで有効になっているので、テクスチャフィルタの設定で無効にする。
Mipmapを使わなければ、OpenGLES2からテクスチャサイズの2の累乗制限を受けないで自由度が増す。
・サイズの大きい画像は圧縮テクスチャにしてから使った方が何かといいみたい。
・でもベタ絵は苦手で圧縮テクスチャにすると劣化がわかりやすくなる事が多かった。写真系はOK。
・作成できる最大テクスチャサイズは、GL_MAX_TEXTURE_SIZEで取得できるがそのまま使用しない事。
glGetIntegerv(GL_MAX_TEXTURE_SIZE, &maxTextureSize);のように関数経由で取得してから
その変数を使用する。
・glGet系はできるだけ呼ばないように心がける。
例えば、上記の最大テクスチャサイズを毎フレーム調べるような処理はせず初期化時一回で済ませる。
・頂点シェーダもフラグメントシェーダも最終的に変数はfloatで扱う。
色情報をGL_UNSIGNED_BYTEで転送した場合は、
そのattribute変数の各種RGBAを255.0で割った値を最終的にシェーダに渡す。
・フラグメントシェーダはいるのか?ってくらいシンプルなものを心がける。
iPhone4 では、条件分岐だけでも使い方を工夫しないと重くなりやすい模様。
頂点シェーダで計算できるものは全部頂点シェーダで計算し、
varying経由で結果をフラグメントシェーダに渡して参照させるだけにした方が良い。
・attributeは頂点シェーダのみに渡せる変数
varyingは頂点シェーダからフラグメントシェーダに渡せる変数と覚える。
uniformは頂点シェーダ、フラグメントシェーダ両方に渡せる変数
・80ピクセル平方のスプライトをFPS60を切るまで画面中に散乱させたら
250枚前後しか出せず落胆。が、32ピクセルだと1200枚を超えたのでタイルサイズの考慮が大事?
[追記]
ブレンディングをしないと80ピクセルも1200近く出た。
円の描画も円のテクスチャではなく、円型ポリゴンをブレンドかけずに出したほうが早いかも?
OpenGLES2.0は、1.1より気難しくて意外と苦労しますね…。
iPhone4より性能がいい端末は、ここまで気を遣わなくてもいいはず‥。
・InstrumentsでOpenGL解析を使用して毎フレーム警告がでる部分は
解消すればそれなりに処理時間も改善されている模様。
・Mipmapは1.1同様、2の累乗サイズでしか作成できない。
必要ないならデフォルトで有効になっているので、テクスチャフィルタの設定で無効にする。
Mipmapを使わなければ、OpenGLES2からテクスチャサイズの2の累乗制限を受けないで自由度が増す。
・サイズの大きい画像は圧縮テクスチャにしてから使った方が何かといいみたい。
・でもベタ絵は苦手で圧縮テクスチャにすると劣化がわかりやすくなる事が多かった。写真系はOK。
・作成できる最大テクスチャサイズは、GL_MAX_TEXTURE_SIZEで取得できるがそのまま使用しない事。
glGetIntegerv(GL_MAX_TEXTURE_SIZE, &maxTextureSize);のように関数経由で取得してから
その変数を使用する。
・glGet系はできるだけ呼ばないように心がける。
例えば、上記の最大テクスチャサイズを毎フレーム調べるような処理はせず初期化時一回で済ませる。
・頂点シェーダもフラグメントシェーダも最終的に変数はfloatで扱う。
色情報をGL_UNSIGNED_BYTEで転送した場合は、
そのattribute変数の各種RGBAを255.0で割った値を最終的にシェーダに渡す。
・フラグメントシェーダはいるのか?ってくらいシンプルなものを心がける。
iPhone4 では、条件分岐だけでも使い方を工夫しないと重くなりやすい模様。
頂点シェーダで計算できるものは全部頂点シェーダで計算し、
varying経由で結果をフラグメントシェーダに渡して参照させるだけにした方が良い。
・attributeは頂点シェーダのみに渡せる変数
varyingは頂点シェーダからフラグメントシェーダに渡せる変数と覚える。
uniformは頂点シェーダ、フラグメントシェーダ両方に渡せる変数
・80ピクセル平方のスプライトをFPS60を切るまで画面中に散乱させたら
250枚前後しか出せず落胆。が、32ピクセルだと1200枚を超えたのでタイルサイズの考慮が大事?
[追記]
ブレンディングをしないと80ピクセルも1200近く出た。
円の描画も円のテクスチャではなく、円型ポリゴンをブレンドかけずに出したほうが早いかも?
OpenGLES2.0は、1.1より気難しくて意外と苦労しますね…。