ブログランキング・にほんブログ村へ


iPhone/iPad用潜水艦ゲームアプリ ソナーエコー iTunesにて公開中

2015年08月08日

[iOS] ERROR: Implementation limit of 32 varying components exceeded. Unable to allocate '変数名'

OpenGL のシェーダにコンパイルで
ERROR: Implementation limit of 32 varying components exceeded. Unable to allocate '変数名'
というエラーがでた。

vertexシェーダからflagmentシェーダに渡すvarying変数の数に上限があったとは知らなかった。

ちなみにあんまり考えないでMatrixなんかをvaryingで出してると行列の項目数分出てしまうらしくあっという間に使いきってしまうっぽい。
間を滑らかに繋いでくれる変数なので確かにそんなに気軽に使えるのはおかしいなとは思ってた。
行列の各項目値を滑らかに繋いでその結果を有意義に使う‥そりゃ確かにないかもしれん。
ほとんどcのexternal変数みたいな感覚で使ってたんで反省。
attributeの値に寄らずuniformの値で一意に決まる値などcpuでやっても足ひっぱらないと思うものはできるだけcpuでやってuniformで直接flagmentシェーダに渡すべき、ということなんだろう。

そりゃそうだ。
タグ:iOS OpenGL
posted by みこあいさ at 11:06| iOS開発

[iOS] glActiveTextureの上限は

iOSのOpenGLで同時に扱えるテクスチャの数がいくつか。

glActiveTexture( GL_TEXTURE? );

の?にいったいいくつまで許されているのか。

Apple 公式資料によると
Hardware GPU Information

MAX_TEXTURE_IMAGE_UNITS
または
MAX_COMBINED_TEXTURE_IMAGE_UNITS
の項目らしい。

OpenGL ES 3.0 on Apple A7 and A8 GPUs
では
MAX_TEXTURE_IMAGE_UNITS = 16
MAX_COMBINED_TEXTURE_IMAGE_UNITS = 32

OpenGL ES 2.0 on Apple A7 and A8 GPUs

OpenGL ES 2.0 on PowerVR SGX Series 5 Hardware
では どちらも8

2.0でやってるんで8まででやれば対象機種全部大丈夫ということらしい。

すなわち

GL_TEXTURE0 〜 GL_TEXTURE7

しかし実際のコードで

GL_MAX_TEXTURE_IMAGE_UNITS
を試してみると
34930

GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS
35661

という妙な値が返される。Hexでも意味のある数字とは思えない。
(試したのは iOS7 iPhone5 )

なんでだろう?
とりあえず公式資料を元にプログラムしてみるけど。
posted by みこあいさ at 08:57| iOS開発