きままにものづくり

日々の気付いたことなんかを書いてます。

【iOS】ポイントスプライトのテクスチャを大きくする

問題

glPointSizeの最大値の制限により、倍解像度のiPhone4Sの画面にぴったりなサイズのテクスチャをレンダリングできない。以下の画像が黒いテクスチャをレンダリングした結果。
f:id:even_eko:20130518012827p:plain
本来なら、白い部分が残らず全て黒になるはずである。しかし、glPointSizeの最大値の制限によりそうはなっていない。

目的

倍解像度のiPhone4Sの画面にぴったりなテクスチャをレンダリングしたい。分割してレンダリングする方法もあるが、ポイントスプライトを用いて一度で終了させたい。

試みた方法

glPointParameterfを用いて、glPointSizeの最大値を目的の大きさに変更する。
デフォルトのglPointSizeの最大値は510になっている(iPhone4S)。以下のコードで確認することができる。

GLfloat param;
glGetFloatv(GL_POINT_SIZE_MAX, &param);
NSLog(@"max size is %f",param);

最大値を倍解像度の940に変更してレンダリングした。
f:id:even_eko:20130518012827p:plain
最大値を変化する前と全く変わっていない。
最大値が本当に変化しているかを確かめるため、最大値を250にした。
f:id:even_eko:20130517231606p:plain
小さくする変化の場合は、反映されている。

結果

GL_POINT_SIZE_MAXの値は変更されるが、実際にレンダリングされるテクスチャのサイズは変わらない。ただし、小さい方向には変化する。

考察

appleの資料[4]より、OpenGLESには実装依存な値が数多く存在することが分かる。例としてtextureの最大サイズが挙げられている。glPointSizeの最大値もtextureと同様なのではないか。OpenGL側では値の変更を保持するが、OpenGLiPhoneをつなぐところの実装に依存しているため、サイズが変更されないと考えられる。

まとめ

glPointParameterfによって、glPointSizeの最大値が変更されるか検証を行った。デフォルトの最大値を境にレンダリングされるサイズが変更されなくなった。