OpenGL ES blog

OpenGL ES に関するブログです。 iPhone や Google Android で使われている 組み込み機器向け三次元グラフィックス API OpenGL ES 1.1, 2.0 に関するブログです ( yukio.andoh@gmail.com )

2010年1月20日水曜日

[ES] Nexus One

Google Nexus One が登場しました。

CPU は ARM ベースの 1GHz Snapdragon が載っていて、
ほとんどは CPU で処理をこなせてしまっているようです。

グラフィックスチップに関しては
Qualcomm の Adreno 200 が載っています。
http://www.qualcomm.com/media/videos/adreno.html

残念ながらまだ OpenGL ES-CM 1.1 環境です。
チップ性能としては OpenGL ES 2.0 も可能なのですが、
残念ながらまだ OpenGL ES 1.1 環境のようです。
(libGLESv2_adreno200.so) というファイルが見え隠れするので
近い ES 2.0 対応が期待されます。

トピックスとしては、
VBOs サポート(まああたりまえか)、
ハードウェアによるミップマップ自動生成サポートくらいかな。

Qualcomm Adreno は
AMD(ATI) の流れをくむチップなので、使える拡張命令も AMD(ATI) っぽいものです。
テクスチャ圧縮も 3DC 形式, ATC 形式が使えます。
DevPhone G1 でも裏技で使えていた atitc 圧縮テクスチャも使えます。

3DC(主にカラーマップでは無く、法線マップで利用)
http://ati.amd.com/products/radeonx800/3DcWhitePaper.pdf

ATC や 3DC 関連ドキュメント
http://colecovision.eu/graphics/texture_compression.pdf

◆使える OpenGL 拡張

GL_AMD_compressed_3DC_texture
GL_AMD_compressed_ATC_texture
GL_ARB_texture_env_combine
GL_ARB_texture_env_dot3
GL_ARB_texture_mirrored_repeat
GL_ARB_vertex_buffer_object
GL_ATI_compressed_texture_atitc
GL_ATI_texture_compression_atitc
GL_EXT_blend_equation_separate
GL_EXT_blend_func_separate
GL_EXT_blend_minmax GL_EXT_blend_subtract
GL_EXT_stencil_wrap GL_OES_EGL_image
GL_OES_blend_equation_separate
GL_OES_blend_func_separate GL_OES_blend_subtract
GL_OES_compressed_ETC1_RGB8_texture
GL_OES_compressed_paletted_texture
GL_OES_draw_texture
GL_OES_extended_matrix_palette
GL_OES_framebuffer_object
GL_OES_matrix_palette
GL_OES_point_size_array
GL_OES_point_sprite
GL_OES_read_format
GL_OES_stencil_wrap
GL_OES_texture_cube_map
GL_OES_texture_env_crossbar
GL_OES_texture_mirrored_repeat

2009年10月6日火曜日

[ES] Imagination issue 5

With Imagination Issue 05 - October 2009

PowerVR メーカー Imagination 社から
With Imagination issue 5 が公開されました。
PowerVR 周辺情報が載ったニュースレターです。

OpenGL ES 関連ですと、
新しい PowerVR Insider SDK 2.5 の記事が
少しだけ載っています。

 Displacement Mapping
 Shadow Mapping
 Fur
 Coverflow

SDK 2.5 では上記のデモが新しく追加されているそうです。

(無料ですが、要登録)

2009年9月30日水曜日

[ES] Now available: Android 1.6 NDK

Android Developers Blog: Now available: Android 1.6 NDK

Android NDK(Native Development Kit) から OpenGL ES 1.1 が直接使えるようになりました。
san-angeles という GLSurfaceView を使った新しいサンプルも含まれます。

The ability to use OpenGL ES 1.1 headers and libraries If your application targets Android 1.6, your native code can now directly call OpenGL ES 1.1 functions to perform graphics rendering. This will help those programs that need to send large amounts of vertex data to the GPU. Note, however, that activity lifecycle and surface creation must still be performed from the VM. This NDK contains a new sample ("san-angeles") that shows exactly how to do that with a GLSurfaceView object.

2009年9月28日月曜日

[ES] Creating textures in the PVRTC compression format


Technical Q&A QA1611: Creating textures in the PVRTC compression format

iPhone のグラフィックスチップ PowerVR では、
PVRTC (Power VR Texture Compression) という独自の
テクスチャ圧縮フォーマットが使える。

PVRTC だと、PNG や JPEG などと違って
圧縮展開する時間がロスにならず、
テクスチャとして読み込んだバイナリファイルがそのまま
グラフィックスハードウェアで利用できるので効率がいい。

PVRTC を使ったサンプル
[ PVRTextureLoader ]

PNG, JPEG, TIFF といった普通に扱う画像ファイルを
この専用のPVRTC ファイルに変換するには、
これまた専用のコンバータを使わなければいけない。少々面倒。
/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/texturetool

フォーマットは RGB/RGBA とは別に 2x2 パターンある。

4bpp, Linear
4bpp, Perceptual
2bpp, Linear
2bpp, Perceptual

(4bpp = 1pixel につき 4bit 割り当てて圧縮、サイズ的には 1/8 に圧縮)
(2bpp = 1pixel につき 2bit 割り当てて圧縮、サイズ的には 1/16 に圧縮)
(Linear = RGB 均等わりつけ)
(Perceptual = G(緑) の表現に重点的に割当 :人間の目は、緑の変化に敏感なので)

ピクセルごとの色の変化が激しいのは 4bpp,
変化が少ないのは 2bpp でもいい。

実際のところ、細かいところまで拡大して調べないと
圧縮によるノイズはなかなか分からないので、
できるだけ PVRTC を使うのが得策。

ただし、単にファイルやデータの圧縮率だけを考えると、
必ずしもPVRTC は一番サイズが小さくなる方法では無い点が
注意すべきところ。

あと、PVRTC として、
変に思えるが、実はハードウェアに最適化するための制限がある。

   - 最小サイズ (pixel) は 8、それ以上のサイズであること

   - 縦横のピクセル数は 2 の累乗

   - 画像のサイズは正方形であること(縦と横の pixel 数が同じ)

その他、ハードウェア固有のテクスチャ最大値を超えることはできない
( 3G で 1024 pixel, 3GS で 2048 pixel )

たくさん変換するのは面倒だな。という場合は、
バッチ(連続)で変換する簡易ツールもある
[ Converter_PVRTC ]

このあたり、Windows 版になってしまいますが、PVRTexTool などの専用ツールや Photoshop プラグインが便利です
[ PowevrVR Insider ユーティリティ ]

2009年9月10日木曜日

[ES] Conformant Products

Conformant Products - Khronos Group

GL_RENDERER 話の続き。
新しい iPod touch(2G) 32GB,64GB は OpenGL ES 2.0 対応。
iPod touch 8G は OpenGL ES 1.1 のまま。ややこしい。

iPhone 3GS は PowerVR SGX 535
3G は PowerVR MBXLite with VGPLite
エミュレータの場合は "Apple Software Renderer"

UIImagePickerControllerSourceTypeCamera で
ハードウェアとしてのカメラが搭載されているかどうかで
iPhone と iPod touch は見分けられますが、
将来的に iPod にもカメラが搭載されると
うまくいかないことが容易に予想されます。

UIDevice currentDevice.model や .machine で
iPhone : iPhone1,1
iPhone 3G : iPhone1,2
iPhone 3G S : iPhone2,1
IPod touch : iPod1,1
iPod touch 2G : iPod2,1
iPhone Simulator : i386
と見分けられますが、これも確実では無い。

sample code
http://www.iphonedevsdk.com/forum/iphone-sdk-development/4960-how-identify-device-user.html

uidevice-extension library
http://github.com/erica/uidevice-extension/tree/master

sysctlbyname()
http://developer.apple.com/mac/library/documentation/Darwin/Reference/ManPages/man3/sysctlbyname.3.html

グラフィックス以外の機能(カメラとかマイクとかは)
遠い将来機種が増えることも考え、
機能があるかないかで判別するアプローチが正しい。

その一方グラフィックス機能は、
OpenGL ES の GL_VERSION を確認し、
さらに特殊な拡張機能はその関数が使えるかどうかを
確認するのがベスト。

さらに注意するなら、圧縮テクスチャ関係の関数を使うとき、
圧縮タイプ(アルゴリズム)の確認を怠らないことかな。

余談だけど、GL_VENDOR と同様に
OpenAL の
AL_VENDOR, AL_RENDERER, AL_VERSION, AL_EXTENSIONS
なんかも調べられるんだ。

2009年9月9日水曜日

[ES] Optimizing OpenGL for iPhone

スタンフォード大学 iPhone 開発講座での
OpenGLパフォーマンスチューニングの講義。
その中で
Optimizing OpenGL for iPhone
というゲーム会社 ngmoco の Tim Omernick 氏の招待講演を見ることができます。
(PDF:内容は薄い下記のビデオの方がお薦め)

最後の方のパーティクル(花火)のサンプルはとても美しい。
一番最初は、OpenGL ES テンプレートのとても簡単な図形から、
パーティクル表現に行き着くまでの説明。
そして、そこまでいきつくための実地のチューニング手法が参考になります。

http://skyfell.org/downloads/Fireworks.zip ソースコード

 ●ジオメトリをまとめる
 ●テクスチャを一枚にまとめて、座標で切り替える(テクスチャアトラス)
 ●頂点集合の効率的な使い方
 ●Float と Short の浮動小数点値の使い分け
 ● 3GS > iPod touch 2nd > 3G の順で速いし、エミュレータは速度が違う

(このあたりは WWDC 2009 の時の Performance Tuning の講演がとてもまとまっている)

Optimizing OpenGL for iPhone (iTunes U へのリンク:動画)

CS193P - Cocoa Programming | Announcements


テクスチャアトラスに関しては今度また紹介します。

2009年9月7日月曜日

[ES] GL_RENDERER

Apple iPhone 3G - OpenGL ES performance and system information

glGetString() という関数を使うと、OpenGL(ES) のハードウェア環境を
調べることができます。

例えば、iPhone 3G だと、

GL_VENDOR Imagination Technologies
GL_VERSION OpenGL ES-CM 1.1 (42.1)
GL_RENDERER PowerVR MBXLite with VGPLite

GL_EXTENSIONS
GL_EXT_texture_filter_anisotropic GL_EXT_texture_lod_bias GL_IMG_read_format GL_IMG_texture_compression_pvrtc GL_IMG_texture_format_BGRA8888 GL_OES_blend_subtract GL_OES_compressed_paletted_texture GL_OES_depth24 GL_OES_draw_texture GL_OES_framebuffer_object GL_OES_mapbuffer GL_OES_matrix_palette GL_OES_point_size_array GL_OES_point_sprite GL_OES_read_format GL_OES_rgb8_rgba8 GL_OES_texture_mirrored_repeat

GL_MAX_LIGHTS 8
GL_MAX_TEXTURE_SIZE 1024

などなど。

これを見ると、Imagination Technologies 社の
PowerVR MBX Lite(VGPLite搭載)のチップが使われていることが分かります。

また GL_EXTENSIONS の一覧で、
使える OpenGL 拡張も知ることができます。

その他、ハードウェア環境のリミットも詳細に把握できます。

以外と知られていないのが、ライトの数が 8つまで。
テクスチャデータの縦または横のサイズの最大が 1024 pixel まで
といった制限です。
(iPhone 3GS の GL_MAX_TEXTURE_SIZE は 2048 pixel です)

こういう制限を気にしないとわけもわからず動かなかったりするわけです。
ただ、_MAX_ の制限は仕様としての制限で、
ハードウェアリソースはその前になくなる可能性もあります。
たとえば、iPhone 3G の場合、使えるテクスチャメモリは 24MB 分までで、
たとえ 1024 のサイズ制限に収まっていても、トータルで 24MB 以上の
テクスチャは使えません。

iPhone 3GS の場合は、24MB の制限はありませんが、
ハードウェア全体のメモリ制限の影響を受けます。
( 3GS の PowerVR チップは CPU と統合されているためメモリを効率的に使う)

もっとも iPhone の画面サイズで最大サイズの 1024 pixel のテクスチャを
使うことには意味は無く、たいていは大きくても 128 x 128 程度で十分です。
(ミップマップテクスチャや、圧縮テクスチャを駆使するのもコツのひとつですね)

その他の GL_* の説明や、
GL_EXTENSIONS で使える拡張の説明はまた後ほど....