SlideShare a Scribd company logo
Android
OpenGL/ES ハンズオン



              Smart.LABO
         丹所 育男(tan1234jp)



                            1
自己紹介
• 丹所 育男(たんしょ いくお)
• 春日井市出身・自宅は名古屋市・実家は可児市
• 講師→制御系→ネットワーク系→業務系→制御系→
    システム保守→制御系→業務系→携帯アプリ
•   2011年6月に「SMART.LABO」として独立
•   Androidアプリの開発がメイン(iPhone,Coronaも)


• Twitter : @tan1234jp

                                        2
OpenGL/ESとは?
• OpenGL Embedded Subsetの略
• 3Dコンピュータグラフィックス用APIのサブ
    セットで、3D空間に浮かんだ頂点を結んだ図
    形を描画することに特化している。
•   主に携帯電話などの組み込みシステムや、
    ゲーム専用機で使われている。
    →iOS, Android, Symbian OS,
    →PlayStation3、Nintendo 3DS


                                 3
描画APIのサポート
      Canvas      OpenGL/ES
•   点           • 点
•   直線          • 直線
•   三角形         • 三角形
•   四角形
•   五角形以上の多角形
•   円
•   文字


                              4
AndroidのView
• Androidには、3種類のViewがある。
 →View,SurfaceView,GLSurfaceView


• OpenGLでは、GLSurfaceViewを継承したも
 のを使う。




                                   5
GLSurfaceView
• OpenGLの描画に特化したView
• 描画タイミングは端末依存(プログラマが決め
    ることもできる)
•   別スレッドで動作するため、直接UIに対して
    変更をかけることは不可




                            6
OpenGL/ESの初期化
• プロジェクトの作成


                OpenGL_Sample




• バージョンの決定(Ver1.5以降であればOK)
                                7
OpenGL/ESの初期化
• パッケージ名の設定




      com.example.opengl_sample




                                  8
OpenGL/ESの初期化
package com.example.opengl_sample;

import android.app.Activity;
import android.opengl.GLSurfaceView;
import android.os.Bundle;

public class OpenGL_SampleActivity extends Activity {
	
	
	
    private GLSurfaceView glSurfaceView;
                                                  エラーとなるが無視
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        glSurfaceView = new GLSurfaceView(this);
        glSurfaceView.setRenderer(new GLRenderSample());
        setContentView(glSurfaceView);
    }



                                                              9
OpenGL/ESの初期化
	   @Override
	   protected void onPause() {
	   	   super.onPause();
	   	   glSurfaceView.onPause();
	   }

	   @Override
	   protected void onResume() {
	   	   super.onResume();
	   	   glSurfaceView.onResume();
	   }

	   //ここに後でコードを追加します!
}




                                    10
OpenGL/ESの初期化
        GLRenderSampleの作成
        onResume()の後に以下のコードを追加。
	   class GLRenderSample implements GLSurfaceView.Renderer {

	   	   public void onDrawFrame(GL10 gl) {
	   	   	 gl.glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
	   	   	 gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
	   	   }

	   	   public void onSurfaceChanged(GL10 gl, int width, int height) {
	   	   	 gl.glViewport(0, 0, width, height);
	   	   }

	   	   public void onSurfaceCreated(GL10 gl, EGLConfig config) {
	   	   }
	




                                                                         11
OpenGL/ESの初期化
• 実行!
 真っ白な画面になりました
 か?




                12
コード解説
   • GLRenderSampleの各メソッド
 メソッド名                                    呼ばれるタイミング
onSurfaceCreated(GL10 gl, EGLConfig eglconfig) GLSurfaceView用のメモリ確保が終了

onSurfaceChanged(GL10 gl, int width, int height) 画面サイズが変更された時

onDrawFrame(GL10 gl)                     再描画が必要な時




                                                                       13
コード解説
• 各メソッドの呼び出され方
     onSurfaceCreated

     onSurfaceChanged

       onDrawFrame
              呼び出されるタイミングは
                  端末依存
                             14
コード解説
   • 描画範囲の設定
 メソッド名                                    役割

                                                 OpenGL/ESの描画範囲を指定する。
glViewport(int x, int y, int width, int height); 「どの座標(x, y)から、幅width、高さheightま
                                                 で」を描画範囲とする。




                                                                                  15
コード解説
    • 描画クリア
  メソッド名                             役割
                                              画面全体を塗りつぶす色を決定する。RGBA(A
glClearColor(float r, float g, float b, float a); はアルファ値)を指定する。
                                              指定できる範囲は0∼1の実数値。
                                   塗りつぶしを実行する。引数に
glClear(int mask);
                                   GL_COLOR_BUFFER_BITを指定する。


    • glClearColorの引数の値を適当に変更して、
         いろいろな色で塗りつぶされることを確認し
         てみてください。

                                                                        16
OpenGL/ESの座標系
• 座標系の違い
                     (480,0)
  原点(0,0)                               (0,1)




    (Xperiaの場合)                (-1,0)                      (1,0)
                                                 原点(0,0)


       View
       SurfaceView                               OpenGL

  (0,854)                               (0,-1)


                                                                   17
三角形を描画する
• 例えば、(0,0),(1,0),(1,1)の3点を結ぶ三角形
    を描画する場合・・・

        HT-03A             Xperia




480px              854px




        320px              480px

                                    18
三角形を描画する
• onDrawFrameを修正
	   public void onDrawFrame(GL10 gl) {
	   	   gl.glClearColor(0.0f, 1.0f, 1.0f, 1.0f); //第1引数に変更あり!
	   	   gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
	   	   	
	   	   float positions[] = {
	   	   	   	    1.0f, 0.0f, 0.0f,	/右(1,0)
                                  /
	   	   	   	   0.0f, 0.0f, 0.0f,	/原点(0,0)
                                 /
	   	   	   	   1.0f, 1.0f, 0.0f,	/右上(1,1)
                                 /
	   	   };
	   	   	
	   	   ByteBuffer bb = ByteBuffer.allocateDirect(positions.length * 4);
	   	   bb.order(ByteOrder.nativeOrder());
	   	   FloatBuffer fb = bb.asFloatBuffer();
	   	   fb.put(positions);




                                                                           19
三角形を描画する
• onDrawFrameを修正(続き)
	

	   	   fb.position(0);
	   	   	
	   	   gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
	   	   gl.glVertexPointer(3, GL10.GL_FLOAT, 0, fb);
	   	   gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);
	   }




                                                        20
三角形を描画する
• 実行!
 →水色の背景に白い三角形
 が表示されましたか?
 →解像度の違う端末でも同
 じ画面が表示されました
 か?




                21
コード解説
• 座標の設定
float positions[] = {
	   	    	   	   1.0f, 0.0f, 0.0f,	/右(1,0)
                                  /
	   	   	    	   0.0f, 0.0f, 0.0f,	/原点(0,0)
                                  /
	   	   	    	   1.0f, 1.0f, 0.0f,	/右上(1,1)
                                  /
	   	   };




• 浮動小数の1次元配列で表す
• 配列に格納する順番は「頂点1(x,y,z)」「頂点
    2(x,y,z)」「頂点3(x,y,z)」・・・とする。


                                              22
コード解説
• 座標配列をOpenGL/ESに転送
  ByteBuffer bb = ByteBuffer.allocateDirect(positions.length * 4);
  bb.order(ByteOrder.nativeOrder());
  FloatBuffer fb = bb.asFloatBuffer();
  fb.put(positions);
  fb.position(0);


• 座標配列をOpenGL/ESで扱えるメモリ形式に
 変換

• AndroidでOpenGL/ESを扱う際の「おまじな
 い」。

                                                                     23
コード解説
• OpenGL/ESは、Android Runtimeではなく
  Libraries群(CPU依存)

• Javaの配列などのデータを、そのまま
  OpenGL/ESへ転送することはできない

• java.nio.* パッケージを使用して、OpenGL/
  ESから直接参照できるようなデータに変換す
  る必要がある。


                                   24
Androidアーキテクチャ




                 25
コード解説
   • GLSurfaceViewに描画する
 メソッド名                                   役割
                                                glVertexPointer()で転送するメモリ情報の種類
                                                を設定する。引数はいろいろあるが、座標情報
glEnableClientState(int array);
                                                を転送する場合は「GL_VERTEX_ARRAY」を
                                                指定する。
                                                位置情報を設定する。
                                                size : 位置情報の要素数。3次元の場合は3。
glVertexPointer(int size, int type, int stride,
                                                type : 位置情報の変数の型。
Buffer pointer);
                                                stride : 常時0。
                                                pointer : OpenGL/ESに転送可能な位置情報
                                                GLSurfaceViewに描画する。
                                                mode : 描画方法を指定する(後ほど説明)
glDrawArrays(int mode, int first, int count);
                                                first : 描画する位置情報の開始位置。
                                                count : 位置情報を使用する数。


                                                                                 26
(発展)四角形を描画する
• onDrawFrameを修正
	   public void onDrawFrame(GL10 gl) {
	   	   	    :
	   	   	    :
	   	   float positions[] = {
	   	   	   	    1.0f, 0.0f, 0.0f,	/右(1,0)
                                  /
	   	   	    	   0.0f, 0.0f, 0.0f,	/原点(0,0)
                                  /
	   	   	    	   1.0f, 1.0f, 0.0f,	/右上(1,1)
                                  /
	   	   	    	   0.0f, 0.0f, 0.0f,	/原点(0,0)
                                  /
	   	   	    	   0.0f, 1.0f, 0.0f,	/上(0,1)
                                  /
	   	   	    	   1.0f, 1.0f, 0.0f,	/右上(1,1)
                                  /
	   	   };




                                              27
(発展)四角形を描画する
• onDrawFrameを修正(続き)
	   	   	   :
	   	   	   :
	   	   gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
	   	   gl.glVertexPointer(3, GL10.GL_FLOAT, 0, fb);
	   	   gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3 * 2);
	   }




                                                        28
(発展)四角形を描画する
• 実行!
 →水色の背景の右上に、白
 い四角形が表示されました
 か?
 →解像度の違う端末でも同
 じ画面が表示されました
 か?



                29
(発展)四角形を描画する
• 三角形を組み合わせれば、どんな多角形でも
 作成可能




        +      =




                         30
(発展)四角形を描画する
• 重複している座標がある!
	   public void onDrawFrame(GL10 gl) {
	   	   	    :
	   	   	    :
	   	   float positions[] = {
	   	   	   	    1.0f, 0.0f, 0.0f,	/右(1,0)
                                  /
	   	   	    	   0.0f, 0.0f, 0.0f,	/原点(0,0)
                                  /
	   	   	    	   1.0f, 1.0f, 0.0f,	/右上(1,1)
                                  /
	   	   	    	   0.0f, 0.0f, 0.0f,	/原点(0,0)
                                  /
	   	   	    	   0.0f, 1.0f, 0.0f,	/上(0,1)
                                  /
	   	   	    	   1.0f, 1.0f, 0.0f,	/右上(1,1)
                                  /
	   	   };


    • 座標を使いまわししたい!
                                              31
(発展)四角形を描画する
• onDrawFrameを修正
	   public void onDrawFrame(GL10 gl) {
	   	   	    :
	   	   	    :
	   	       float positions[] = {
	   	       	   	    1.0f, 0.0f, 0.0f,	/右(1,0)
                                      /
	   	       	       	   0.0f, 0.0f, 0.0f,	/原点(0,0)
                                         /
	   	       	       	   1.0f, 1.0f, 0.0f,	/右上(1,1)
                                         /
	   	   	       //	 	   0.0f, 0.0f, 0.0f,//原点(0,0)
	   	   	       	   	   0.0f, 1.0f, 0.0f,//上(0,1)
	   	   	       //	 	   1.0f, 1.0f, 0.0f,//右上(1,1)
	   	       };




                                                     32
(発展)四角形を描画する
• onDrawFrameを修正(続き)
    	   	   	   :
    	   	   	   :	 	
	       	   gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
    	   	   gl.glVertexPointer(3, GL10.GL_FLOAT, 0, fb);
	       	   gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4); //第1・3引数変更
    	   }




                                                                        33
(発展)四角形を描画する
• 実行!
 →先ほどと同じ画面になり
 ましたか?




                34
glDrawArraysの引数
• glDrawArrays()の第1引数で指定する値(定数)
  により、描画方法を変更することができる。
 引数                       説明
GL10.GL_POINTS           点
GL10.GL_LINES            直線
GL10.GL_LINE_STRIP       折れ線
GL10.GL_TRIANGLES        三角形
GL10.GL_TRIANGLE_STRIP   1辺を共有しながら帯状に三角形を描画する
GL10.GL_TRIANGLE_FAN     1点を共有しながら扇状に三角形を描画する




                                                35
glDrawArraysの引数
• 描画方法の違い
	   public void onDrawFrame(GL10 gl) {
	   	   	    :
	   	   	    :
	   	   float positions[] = {
	   	   	    ① 1.0f, 0.0f, 0.0f,	/右(1,0)
             	                    /
	   	       	       	② 0.0f, 0.0f, 0.0f,	/原点(0,0)
                                        /
	   	       	       	③ 1.0f, 1.0f, 0.0f,	/右上(1,1)
                                        /
	   	   	       	   	
                    ④   0.0f, 1.0f, 0.0f,//上(0,1)
	   	       };
	   	       	   :
	   	       	   :
	   	       gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4); //第1・3引数変更
	   }




                                                                        36
GL_POINTS
• 点(1px)を描画する

                ④   ③




                ②   ①




                        37
GL_LINES
• 直線を描画する時に使う
• 座標の描画順は、①②→③④→⑤⑥→
           ④   ③




           ②   ①




                      38
GL_LINE_STRIP
• 直線を描画する時に使う
• 座標の描画順は、①②→②③→③④→④⑤→
          ④     ③




          ②     ①




                         39
GL_TRIANGLE_STRIP
• 隣接した三角形を描画する時に使う
• 座標の描画順は、①②③→②③④→③④⑤→
      ④   ③    ④    ③




      ②   ①    ②    ①




                         40
GL_TRIANGLE_FAN
• 扇形を描画する時に使う
• 座標の描画順は、①②③→①③④→①④⑤→
      ④   ③    ④   ③




      ②   ①    ②   ①




                         41
GL_TRIANGLE_FAN
• 引数を変更して実行する
 と、右の図形が描画されま
 す。




                  42
色をつける
• onDrawFrameを修正
	   public void onDrawFrame(GL10 gl) {
	   	   	    :
	   	   	    :	 	
	   	   gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
	   	   gl.glVertexPointer(3, GL10.GL_FLOAT, 0, fb);
	   	   gl.glColor4f(1.0f, 0.0f, 0.0f, 1.0f); //追加
	   	   gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);
	   }




                                                         43
色をつける
• 実行!
 →水色の背景の右上に、赤
 い四角形が表示されました
 か?




                44
コード解説
  • 描画色を指定する
  メソッド名                                       役割
                                             描画色を決定する。RGBA(Aはアルファ値)を指
glColor4f(float r, float g, float b, float a);   定する。
                                             指定できる範囲は0∼1の実数値。




    • glColor4fの引数の値を適当に変更して、いろ
          いろな色で塗りつぶされることを確認してみ
          てください。

                                                                        45
• 本日のハンズオンはここまでです。お疲れ様
 でした。

• 今回は、単純に三角形を描画するのみでした
 が、任意の場所への描画や回転、拡大・縮
 小、任意画像の描画などもできます。

• ・・・が、数学(行列)の知識が必要となります
 ので、次回(?)のハンズオンにできればと
 思っております。



                           46

More Related Content

PDF
openFrameworks Workshop in Kanazawa v001
PDF
Unity道場京都スペシャル トゥーンシェーディングとノンフォトリアリスティック風絵づくり入門_
PDF
【Unity道場 2月】シェーダを書けるプログラマになろう
PDF
Media Art II 2013 第7回 : openFrameworks 3Dグラフィクス、OpenGL
PDF
3次元図形をSchemeで造ろう!
PPTX
CG2013 07
KEY
シェーダーしよっ☆ Let's play shaders!
PPTX
OpenGLと行列
openFrameworks Workshop in Kanazawa v001
Unity道場京都スペシャル トゥーンシェーディングとノンフォトリアリスティック風絵づくり入門_
【Unity道場 2月】シェーダを書けるプログラマになろう
Media Art II 2013 第7回 : openFrameworks 3Dグラフィクス、OpenGL
3次元図形をSchemeで造ろう!
CG2013 07
シェーダーしよっ☆ Let's play shaders!
OpenGLと行列

What's hot (19)

PDF
【Unite Tokyo 2018】誘導ミサイル完全マスター
PPTX
CG2013 06
PDF
OpenFOAM の cyclic、cyclicAMI、cyclicACMI 条件について
PDF
メディア・アートII 第3回 openFrameworks基礎 OOoF : オブジェクト指向 oF
PDF
Media Art II openFrameworks 複数のシーンの管理・切替え
PDF
簡単!OpenGL ES 2.0フラグメントシェーダー
PDF
GLSLによるシェーダーアートことはじめ
PDF
OpenFOAM -空間の離散化と係数行列の取り扱い(Spatial Discretization and Coefficient Matrix)-
PDF
【TechBuzz】第9回cocos2d-x勉強会「シェーダ書いてますか?」
PPTX
CG2013 03
PDF
OpenFOAM -回転領域を含む流体計算 (Rotating Geometry)-
PDF
Media Art II 2013 第4回:openFrameworks アニメーションを極める 動きを生みだす様々なアルゴリズム
PDF
デジタルアートセミナー#2 openFrameworksで学ぶ、 クリエイティブ・コーディング Session 2: 構造をつくる
PPTX
AVX-512(フォーマット)詳解
PDF
【Unite 2018 Tokyo】60fpsのその先へ!スマホの物量限界に挑んだSTG「アカとブルー」の開発設計
PPTX
CG2013 08
PDF
OpenGL 3DCG
PDF
Intro to SVE 富岳のA64FXを触ってみた
PDF
Intel AVX-512/富岳SVE用SIMDコード生成ライブラリsimdgen
【Unite Tokyo 2018】誘導ミサイル完全マスター
CG2013 06
OpenFOAM の cyclic、cyclicAMI、cyclicACMI 条件について
メディア・アートII 第3回 openFrameworks基礎 OOoF : オブジェクト指向 oF
Media Art II openFrameworks 複数のシーンの管理・切替え
簡単!OpenGL ES 2.0フラグメントシェーダー
GLSLによるシェーダーアートことはじめ
OpenFOAM -空間の離散化と係数行列の取り扱い(Spatial Discretization and Coefficient Matrix)-
【TechBuzz】第9回cocos2d-x勉強会「シェーダ書いてますか?」
CG2013 03
OpenFOAM -回転領域を含む流体計算 (Rotating Geometry)-
Media Art II 2013 第4回:openFrameworks アニメーションを極める 動きを生みだす様々なアルゴリズム
デジタルアートセミナー#2 openFrameworksで学ぶ、 クリエイティブ・コーディング Session 2: 構造をつくる
AVX-512(フォーマット)詳解
【Unite 2018 Tokyo】60fpsのその先へ!スマホの物量限界に挑んだSTG「アカとブルー」の開発設計
CG2013 08
OpenGL 3DCG
Intro to SVE 富岳のA64FXを触ってみた
Intel AVX-512/富岳SVE用SIMDコード生成ライブラリsimdgen
Ad

Similar to Android OpenGL HandsOn (20)

PDF
Android上での3D(OpenGL)描画の基礎とNDKによる実践的高速化手法
PDF
coma Creators session vol.2
PPTX
Shadow gunのサンプルから学べるモバイル最適化
KEY
Clojure programming-chapter-2
PDF
p5.js 授業テキスト
PDF
PPTX
シェーダー伝道師 第一回
PPTX
3D で遊ぼう ~C#er も TypeScript で楽々 WebGL~
PDF
Android gameprogramming
PPTX
OpenGLと行列
PDF
Processing
PDF
Rのデータ構造とメモリ管理
PDF
Flashup 12 Basic Training of Away3D
PPTX
どこでも動くゲームを作るためのベタープラクティス
PDF
ちょっと詳しくJavaScript 第4回【スコープとクロージャ】
PDF
Flutterを体験してみませんか
PDF
JavaScript経験者のためのGo言語入門
PDF
ARコンテンツ作成勉強会:C#ではじめようOpenCV(カラートラッキング編)
PDF
FiltersでGLSLを楽しく学んじゃおう!
PPTX
シェーダー伝道師 第二回
Android上での3D(OpenGL)描画の基礎とNDKによる実践的高速化手法
coma Creators session vol.2
Shadow gunのサンプルから学べるモバイル最適化
Clojure programming-chapter-2
p5.js 授業テキスト
シェーダー伝道師 第一回
3D で遊ぼう ~C#er も TypeScript で楽々 WebGL~
Android gameprogramming
OpenGLと行列
Processing
Rのデータ構造とメモリ管理
Flashup 12 Basic Training of Away3D
どこでも動くゲームを作るためのベタープラクティス
ちょっと詳しくJavaScript 第4回【スコープとクロージャ】
Flutterを体験してみませんか
JavaScript経験者のためのGo言語入門
ARコンテンツ作成勉強会:C#ではじめようOpenCV(カラートラッキング編)
FiltersでGLSLを楽しく学んじゃおう!
シェーダー伝道師 第二回
Ad

Android OpenGL HandsOn