Android上での3D描画の基礎と、 NDKによる実践的⾼速化⼿法。                               2011年7⽉17⽇           (C)2011 HI CORPORATION. All Rights ...
ご挨拶吉⽥ 宏(よしだ ひろし)株式会社エイチアイ 開発部門 基盤技術部1課 所属3Dエンジン“MascotCapsule”を中⼼にミドルウェア製品企画・開発・サポートを担当                                   ...
アジェンダ1.SDK(Java)サンプルを使い、OpenGL ESの基礎を解説2.NDK(C-Native)で⾼速化!3.その他の⾼速化ポイント                   <3>   (C)2011 HI CORPORATION. A...
1. SDK(Java)サンプルを使い、OpenGL ESの基礎を解説javax.microedition.khronos.opengles AndroidにおけるOpenGL ESサポートの標準となる パッケージ。   http://deve...
1. SDK(Java)サンプルを使い、OpenGL ESの基礎を解説              改変元のオリジナルプログラムは              ApiDemosサンプル中の              Graphics/OpenGL/...
1. SDK(Java)サンプルを使い、OpenGL ESの基礎を解説 1.サンプルプログラムを自分のワークスペース配下に展開 2.Package ExplorerもしくはFileメニューからImport   General/Existing ...
1. SDK(Java)サンプルを使い、OpenGL ESの基礎を解説 4. Projectsの欄に2本のサンプルが表⽰されていることを    確認して、Finishボタンを押す。    Projectメニューの”Build Automatic...
1. SDK(Java)サンプルを使い、OpenGL ESの基礎を解説サンプルのビルドに失敗する場合 ・サンプルはAndroid2.1-update1を使用  それ以外のSDKを使う場合には、プロジェクトの  PropertyのAndroidの...
1. SDK(Java)サンプルを使い、OpenGL ESの基礎を解説              PackageExplorerのsrcを展開し、              Cube.javaを開く。                  <9> ...
1. SDK(Java)サンプルを使い、OpenGL ESの基礎を解説  Cube.java                          GL_FIXED(固定⼩数点)で、                                 ...
1. SDK(Java)サンプルを使い、OpenGL ESの基礎を解説                                   左の要素からRGBAを表します。  Cube.java                         ...
1. SDK(Java)サンプルを使い、OpenGL ESの基礎を解説                      キューブは、三角形12個で構成  Cube.java                     されています。インデックスバッファ ...
1. SDK(Java)サンプルを使い、OpenGL ESの基礎を解説Cube.java     ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length*4);     vbb.or...
1. SDK(Java)サンプルを使い、OpenGL ESの基礎を解説Cube.java  public void draw(GL10 gl)   {     gl.glFrontFace(gl.GL_CW);          ・      ...
1. SDK(Java)サンプルを使い、OpenGL ESの基礎を解説Cube.java           用意したByteBufferを毎フレーム転送します。(頂点配列)         OpenGL ES1.1以降では、バッファオブジェク...
1. SDK(Java)サンプルを使い、OpenGL ESの基礎を解説 Androidにおいて、OpenGL ESで描画を⾏うには、 GLSurfaceViewの流儀で実装する必要がある。 ①GLSurfaceViewのインスタンスを⽣成 ②G...
2.NDK(C-Native)で⾼速化!  OpenGL ESを使ったにもかかわらず、  思ったほどフレームレートが上がらない?                   <17>   (C)2011 HI CORPORATION. All Righ...
2.NDK(C-Native)で⾼速化!アプリは膨大な回数のOpenGL ES呼び出しで構成。今回のサンプルも、⾏列演算を用いて個別に回転。glDrawElements()だけでもCubeの個数分実⾏される。(合計512回)          ...
2.NDK(C-Native)で⾼速化!OpenGL ESのC-API自体はかなり⾼速。Java経由でGLメソッドを使用すると、JavaとNativeの変換処理が毎回必要となる。      Java                       ...
2.NDK(C-Native)で⾼速化!Draw()    Java                                       C-Native     glDrawElements()                    ...
2.NDK(C-Native)で⾼速化!メソッドをC⾔語で記述し、JNIで呼び出すには? ・nativeという宣⾔を持つ、ダミーのJavaメソッドを記述    HiGlesDemoNdk.java      private native voi...
2.NDK(C-Native)で⾼速化!メソッドをC⾔語で記述し、JNIで呼び出すには? ・jniディレクトリにShell(コマンドライン)で移動し、     ndk-build スクリプトを実⾏。     →/libs/armeabi ディレ...
2.NDK(C-Native)で⾼速化!同じ機能をNDK(JNI)で実装したサンプルのソースを確認。※jniディレクトリ以下のdemo.cソースを参照                                           Java...
2.NDK(C-Native)で⾼速化!               ⾒た目はSDK(Java)版と同じ。               ※背景⾊のみSDKと⾒た目を                変えるため、グレーに変更。           ...
2.NDK(C-Native)で⾼速化!SDK版とNDK版動作速度⽐較 SDK(Java)                   19.24FPS NDK(JNI:C-Native)           29.09FPS             ...
2.NDK(C-Native)で⾼速化!NativeActivityという選択肢は? Android2.3(GingerBread)以降のみで対応している機能。 Android2.2(Froyo)以前の端末がまだまだ流通している 現状では、ND...
3. その他の⾼速化ポイント・圧縮テクスチャの使用  ATITC (Qualcomm系チップ)  PVRTC (PowerVR系チップ)  DXT    (nVidia系チップ)  ※環境ごとに別の圧縮テクスチャが必要  OpenGL ES2....
3. その他の⾼速化ポイント・Triangle Listではなく、Triangle Strip形式の活用            http://en.wikipedia.org/wiki/Triangle_strip より引用Stripが⻑くなれ...
One more thing!OpenGL ESを使えば、⾼速にポリゴンが描画できる。しかし、それでアプリを作るのに必要な機能は充分?      例)      ボーンアニメーション      カメラ制御      3Dツールで作成したデータの...
One more thing!           MascotCapsule eruption ST ・今までの3D描画エンジンと比べて処理速度が速くなり、ポリゴンの表示能  力が飛躍的に向上。 ・機器を選ばないライブラリ実装で、ネイティブ、...
One more thing!                           MascotCapsule eruption ST 主要機能         モーションブレンド                   モーフィング       ...
One more thing!                     MascotCapsule eruption ST 主要機能                  ⽴体視対応                                 ...
ご清聴ありがとうございました。     http://www.hicorp.co.jp http://www.mascotcapsule.com             <33>   (C)2011 HI CORPORATION. All Ri...
Upcoming SlideShare
Loading in...5
×

Android上での3D(OpenGL)描画の基礎とNDKによる実践的高速化手法

11,577

Published on

ちょっと古いですが、Android Bazaar and Conference 2011 Summer での講演資料です。
OpenGLの基礎と、Android NDKでの高速化のポイントについて説明したものです。

Sample: https://www.dropbox.com/s/feu91385ksgo7gb/ABC2011Summer_HICORP_Samples.zip
(会社HPのリニューアルに伴い、リンク切れを起こしていたので修正しました)
Movie: http://www.youtube.com/watch?v=uLSuw2_kBfY

Published in: Technology
0 Comments
6 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
11,577
On Slideshare
0
From Embeds
0
Number of Embeds
4
Actions
Shares
0
Downloads
11
Comments
0
Likes
6
Embeds 0
No embeds

No notes for slide

Android上での3D(OpenGL)描画の基礎とNDKによる実践的高速化手法

  1. 1. Android上での3D描画の基礎と、 NDKによる実践的⾼速化⼿法。 2011年7⽉17⽇ (C)2011 HI CORPORATION. All Rights Reserved.
  2. 2. ご挨拶吉⽥ 宏(よしだ ひろし)株式会社エイチアイ 開発部門 基盤技術部1課 所属3Dエンジン“MascotCapsule”を中⼼にミドルウェア製品企画・開発・サポートを担当 yosyda <2> (C)2011 HI CORPORATION. All Rights Reserved.
  3. 3. アジェンダ1.SDK(Java)サンプルを使い、OpenGL ESの基礎を解説2.NDK(C-Native)で⾼速化!3.その他の⾼速化ポイント <3> (C)2011 HI CORPORATION. All Rights Reserved.
  4. 4. 1. SDK(Java)サンプルを使い、OpenGL ESの基礎を解説javax.microedition.khronos.opengles AndroidにおけるOpenGL ESサポートの標準となる パッケージ。 http://developer.android.com/reference/javax/microedition/khronos/opengles/GL10.html より引用 <4> (C)2011 HI CORPORATION. All Rights Reserved.
  5. 5. 1. SDK(Java)サンプルを使い、OpenGL ESの基礎を解説 改変元のオリジナルプログラムは ApiDemosサンプル中の Graphics/OpenGL/GLSurfaceView キューブ2個→8×8×8(512個) <5> (C)2011 HI CORPORATION. All Rights Reserved.
  6. 6. 1. SDK(Java)サンプルを使い、OpenGL ESの基礎を解説 1.サンプルプログラムを自分のワークスペース配下に展開 2.Package ExplorerもしくはFileメニューからImport General/Existing Projects into Workspaceを選択  3.Select root directoryからサンプルプログラムを展開 したディレクトリを選択 <6> (C)2011 HI CORPORATION. All Rights Reserved.
  7. 7. 1. SDK(Java)サンプルを使い、OpenGL ESの基礎を解説 4. Projectsの欄に2本のサンプルが表⽰されていることを 確認して、Finishボタンを押す。 Projectメニューの”Build Automatically”がチェックさ れていれば、自動的にビルドが完了する。 <7> (C)2011 HI CORPORATION. All Rights Reserved.
  8. 8. 1. SDK(Java)サンプルを使い、OpenGL ESの基礎を解説サンプルのビルドに失敗する場合 ・サンプルはAndroid2.1-update1を使用  それ以外のSDKを使う場合には、プロジェクトの  PropertyのAndroidの項目にある“Project Build Target”  をインストール済のSDKと合わせる必要あり。 ・リソース関連のエラー(R.java)が発⽣する場合、  プロジェクトをRefresh(F5)することや、Cleanしてみる  ことで、解決する場合もある。 <8> (C)2011 HI CORPORATION. All Rights Reserved.
  9. 9. 1. SDK(Java)サンプルを使い、OpenGL ESの基礎を解説 PackageExplorerのsrcを展開し、 Cube.javaを開く。 <9> (C)2011 HI CORPORATION. All Rights Reserved.
  10. 10. 1. SDK(Java)サンプルを使い、OpenGL ESの基礎を解説 Cube.java GL_FIXED(固定⼩数点)で、 0x10000が1.0fを意味します。int one = 0x10000; (-1.0) int vertices[] = { ③ ② -one, -one, -one, (0) one, -one, -one, ① (+1.0) one, one, -one, ② ⑦ ⑥ (+1.0) -one, one, -one, ③ -one, -one, one, ④ (0) ① one, -one, one, ⑤ Y one, one, one, ⑥ -one, one, one, ⑦ }; (-1.0)④ ⑤ (-1.0) (+1.0) Z X <10> (C)2011 HI CORPORATION. All Rights Reserved.
  11. 11. 1. SDK(Java)サンプルを使い、OpenGL ESの基礎を解説 左の要素からRGBAを表します。 Cube.java スムースシェーディングで着⾊する 各頂点の⾊を指定します。int colors[] = { 0, 0, 0, one, ⿊ one, 0, 0, one, ③ ② 赤 one, one, 0, one, ⻩ 0, one, 0, one, 緑 0, 0, one, one, ⻘ ⑦ ⑥ one, 0, one, one, マゼンタ one, one, one, one, ⽩ (0) ① 0, one, one, one, シアン }; ④ ⑤ <11> (C)2011 HI CORPORATION. All Rights Reserved.
  12. 12. 1. SDK(Java)サンプルを使い、OpenGL ESの基礎を解説 キューブは、三角形12個で構成 Cube.java されています。インデックスバッファ を使い、定義済の頂点をどう繋いでbyte indices[] = { 三角形を描画するかを指定します。 0, 4, 5, (TriangleList)      0, 5, 1, 1, 5, 6,      1, 6, 2, ③ ② 2, 6, 7,      2, 7, 3, 3, 7, 4, ⑦ ⑥      3, 4, 0, 4, 7, 6, (0) ①      4, 6, 5, 3, 0, 1,      3, 1, 2 ④ ⑤ }; <12> (C)2011 HI CORPORATION. All Rights Reserved.
  13. 13. 1. SDK(Java)サンプルを使い、OpenGL ESの基礎を解説Cube.java ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length*4); vbb.order(ByteOrder.nativeOrder()); mVertexBuffer = vbb.asIntBuffer(); mVertexBuffer.put(vertices); 確保しByteBufferに mVertexBuffer.position(0); 頂点データを書き込みます。 ByteBuffer cbb = ByteBuffer.allocateDirect(colors.length*4); cbb.order(ByteOrder.nativeOrder()); mColorBuffer = cbb.asIntBuffer(); mColorBuffer.put(colors); mColorBuffer.position(0); mIndexBuffer = ByteBuffer.allocateDirect(indices.length); mIndexBuffer.put(indices); mIndexBuffer.position(0); <13> (C)2011 HI CORPORATION. All Rights Reserved.
  14. 14. 1. SDK(Java)サンプルを使い、OpenGL ESの基礎を解説Cube.java public void draw(GL10 gl) { gl.glFrontFace(gl.GL_CW);          ・          ・         (略) } 時計回り、反時計回りのどちらの ポリゴンが表⾯なのかを指定します。 (GL_CWは時計周りが表) 表 <14> (C)2011 HI CORPORATION. All Rights Reserved.
  15. 15. 1. SDK(Java)サンプルを使い、OpenGL ESの基礎を解説Cube.java 用意したByteBufferを毎フレーム転送します。(頂点配列) OpenGL ES1.1以降では、バッファオブジェクトを使うことで、 常時GPU側にバッファを置き、⾼速化することも可能です。 public void draw(GL10 gl) {       (略) gl.glVertexPointer(3, gl.GL_FIXED, 0, mVertexBuffer); gl.glColorPointer(4, gl.GL_FIXED, 0, mColorBuffer); gl.glDrawElements(gl.GL_TRIANGLES, 36, gl.GL_UNSIGNED_BYTE, mIndexBuffer); } TriangleList形式で、インデックスバッファの頭から 36要素(12ポリゴン)分を描画することを指⽰します。 <15> (C)2011 HI CORPORATION. All Rights Reserved.
  16. 16. 1. SDK(Java)サンプルを使い、OpenGL ESの基礎を解説 Androidにおいて、OpenGL ESで描画を⾏うには、 GLSurfaceViewの流儀で実装する必要がある。 ①GLSurfaceViewのインスタンスを⽣成 ②GLSurfaceView.Renderer を継承したRendererクラスを作成 onDrawFrame() onSurfaceCreated() onSurfaceChanged() など必要なメソッドを記述。 ③setContentView()で、GLSurfaceViewをActivityの描画対象に設定 ActivityのonResume() / onPause()から、GLSurfaceViewの onResume() / onPause()をオーバーライド HiGlesDemoSdk.java / CubeRenderer.javaの実装を参照。 <16> (C)2011 HI CORPORATION. All Rights Reserved.
  17. 17. 2.NDK(C-Native)で⾼速化! OpenGL ESを使ったにもかかわらず、 思ったほどフレームレートが上がらない? <17> (C)2011 HI CORPORATION. All Rights Reserved.
  18. 18. 2.NDK(C-Native)で⾼速化!アプリは膨大な回数のOpenGL ES呼び出しで構成。今回のサンプルも、⾏列演算を用いて個別に回転。glDrawElements()だけでもCubeの個数分実⾏される。(合計512回) <18> (C)2011 HI CORPORATION. All Rights Reserved.
  19. 19. 2.NDK(C-Native)で⾼速化!OpenGL ESのC-API自体はかなり⾼速。Java経由でGLメソッドを使用すると、JavaとNativeの変換処理が毎回必要となる。 Java C-Native glDrawElements() 重(JNI) glDrawElements() Javaの重いGL-APIを使うのではなく、 C-Native APIを使い、JNI呼び出しの回数を まとめて減らすことが⾼速化にとても重要 <19> (C)2011 HI CORPORATION. All Rights Reserved.
  20. 20. 2.NDK(C-Native)で⾼速化!Draw() Java C-Native glDrawElements() 重(JNI) glDrawElements() glDrawElements() glDrawElements() glDrawElements() glDrawElements() glDrawElements() glDrawElements()Draw() glDrawElements() nativeRender() 重(JNI) glDrawElements() nativeRender() glDrawElements()ついでに、アプリのロジック自体もC⾔語で書いてしまうとさらに⾼速! glDrawElements() <20> (C)2011 HI CORPORATION. All Rights Reserved.
  21. 21. 2.NDK(C-Native)で⾼速化!メソッドをC⾔語で記述し、JNIで呼び出すには? ・nativeという宣⾔を持つ、ダミーのJavaメソッドを記述 HiGlesDemoNdk.java private native void nativeInit(); private native void nativeResize(int w, int h); private native void nativeRender(); ・Eclipseを使い⼀次コンパイル(classファイル⽣成のため) ・ヘッダファイルを⽣成  javah というユーティリティで自動的に⽣成可能。 ・ヘッダと対応したCソースファイルを記述。 <21> (C)2011 HI CORPORATION. All Rights Reserved.
  22. 22. 2.NDK(C-Native)で⾼速化!メソッドをC⾔語で記述し、JNIで呼び出すには? ・jniディレクトリにShell(コマンドライン)で移動し、 ndk-build スクリプトを実⾏。 →/libs/armeabi ディレクトリに.soが⽣成される。 ・Eclipseから、⽣成済の.soを含めてビルド・実⾏。 今回のNDK向けサンプルも、上記の2⼿順でビルド可能 (Android NDKサンプルのSanAngelesの構成を踏襲) <22> (C)2011 HI CORPORATION. All Rights Reserved.
  23. 23. 2.NDK(C-Native)で⾼速化!同じ機能をNDK(JNI)で実装したサンプルのソースを確認。※jniディレクトリ以下のdemo.cソースを参照 Java使用の場合と 処理の内容は ほぼ等価。 <23> (C)2011 HI CORPORATION. All Rights Reserved.
  24. 24. 2.NDK(C-Native)で⾼速化! ⾒た目はSDK(Java)版と同じ。 ※背景⾊のみSDKと⾒た目を  変えるため、グレーに変更。 <24> (C)2011 HI CORPORATION. All Rights Reserved.
  25. 25. 2.NDK(C-Native)で⾼速化!SDK版とNDK版動作速度⽐較 SDK(Java) 19.24FPS NDK(JNI:C-Native) 29.09FPS ※Android 2.3.4搭載のNexus Oneにて測定 弊社3Dエンジンを使った例では、フレームレートで 3倍程度の差が出た例もある。 <25> (C)2011 HI CORPORATION. All Rights Reserved.
  26. 26. 2.NDK(C-Native)で⾼速化!NativeActivityという選択肢は? Android2.3(GingerBread)以降のみで対応している機能。 Android2.2(Froyo)以前の端末がまだまだ流通している 現状では、NDKベースでJNI記述するのが現実的。 将来的には、おそらくNativeActivityに集約されるが、 プログラム技術は同じものが転用可能。 <26> (C)2011 HI CORPORATION. All Rights Reserved.
  27. 27. 3. その他の⾼速化ポイント・圧縮テクスチャの使用  ATITC (Qualcomm系チップ)  PVRTC (PowerVR系チップ)  DXT (nVidia系チップ) ※環境ごとに別の圧縮テクスチャが必要  OpenGL ES2.0以降、ETC1は標準で使用可能だが、  アルファ(マスク)のデータを持つことができず使いにくい。 圧縮テクスチャは、展開されずそのままGPUの描画に 使用され、データの転送帯域が⼩さくて済むことから、 処理が⾼速化される場合が多いのがポイント。 <27> (C)2011 HI CORPORATION. All Rights Reserved.
  28. 28. 3. その他の⾼速化ポイント・Triangle Listではなく、Triangle Strip形式の活用 http://en.wikipedia.org/wiki/Triangle_strip より引用Stripが⻑くなればなるほど、インデックスバッファの⻑さと、ポリゴン数の⽐が1:1に収束する。(Triangle Listの場合には常に3:1)ハードウェアが既にセットアップ済の2頂点を再利用して描画するため⼀般的にTriangleListよりも⾼速。 <28> (C)2011 HI CORPORATION. All Rights Reserved.
  29. 29. One more thing!OpenGL ESを使えば、⾼速にポリゴンが描画できる。しかし、それでアプリを作るのに必要な機能は充分? 例) ボーンアニメーション カメラ制御 3Dツールで作成したデータの読み込み 3Dの当たり判定 <29> (C)2011 HI CORPORATION. All Rights Reserved.
  30. 30. One more thing! MascotCapsule eruption ST ・今までの3D描画エンジンと比べて処理速度が速くなり、ポリゴンの表示能 力が飛躍的に向上。 ・機器を選ばないライブラリ実装で、ネイティブ、Javaなどさまざまな環境 でのサポートが可能。 ・国際標準規格であるOpenGL® ESに対応した、3Dアクセラレータチップの 連携が可能。 OpenGL® ES 2.0にも対応。 ・市販3Dツールで作成したデータを専用フォーマットへ変換して使用可能。 ・MascotCapsule V3のmbac/mtraデータの描画も可能。 ・従来のeruptionに対して、立体視機能拡張が追加されています。 <30> (C)2011 HI CORPORATION. All Rights Reserved.
  31. 31. One more thing! MascotCapsule eruption ST 主要機能 モーションブレンド モーフィング エフェクト(パーティクル) モーションブレンドを使うことで、滑ら モーフィング機能を使い、例えばフェイ パーティクル(粒⼦)の運動、形状変化 かにモーションデータを切り替えられま シャルアニメーションのような演出が可 等のパラメータに基づき、粒⼦の集合体 す。 能になります。 をまとめて描画可能です。データは専用 のエフェクトエディタで作成します。 ⾛り 中間 歩き 笑い 中間 怒り テクスチャタイリング バンプマッピング プロジェクションシャドウ 物体の表⾯に凹凸があるように⾒せるこ 少ないテクスチャ領域で、地⾯や壁といっ 物体の影をよりリアルで正確に投影する とができます。(BREW3などOpenGL たサイズの大きな部分をカバーすること ことができます。 ES1.0対応機種は非対応) ができます。 法線マップ <31> (C)2011 HI CORPORATION. All Rights Reserved.
  32. 32. One more thing! MascotCapsule eruption ST 主要機能 ⽴体視対応 V3Loaderサポート MascotCapsule V3用のmbac/mtra 裸眼⽴体視に対応した左目用、右目用の画像を自動的に⽣成可能です。 データの描画が可能です。 OpenGL ES2.0対応 SHARP ⽴体視対応Android端末及び OpenGL ES2.0のShaderを取り扱う (SH-03C / SH-12C等) APIをサポートしています。 ES2.0環境では、ES1.1の固定機能APIが Docomo FOMA ⽴体視対応Prime端末 削除されていますが、独自の Shaderエミュレーションレイヤを実装 (SH-10C / CA-01C / F-09C等) していますので、ES1.1向けのコンテン ツもそのまま動作させることが可能です。 では、端末標準搭載のためライセンス不要! <32> (C)2011 HI CORPORATION. All Rights Reserved.
  33. 33. ご清聴ありがとうございました。 http://www.hicorp.co.jp http://www.mascotcapsule.com <33> (C)2011 HI CORPORATION. All Rights Reserved.
  1. Gostou de algum slide específico?

    Recortar slides é uma maneira fácil de colecionar informações para acessar mais tarde.

×