blog

Android OpenGLes 3.0学習:頂点描画メソッド VBOs

現在、android 4.3以上のみがopengles 3.0をサポートしていますが、opengles 3.0をサポートできるandroid 4.3を搭載したハードウェアはほとんどありません。しかし幸...

Jun 7, 2014 · 6 min. read
シェア

現在、android 4.3以上のみがopengles 3.0をサポートしていますが、android 4.3を実行している多くのハードウェアがopengles 3.0をサポートすることも非常に少数です。しかし幸いなことに、opengles 3.0は後方互換性があり、プログラムがハードウェアがopengles 3.0をサポートしていないと判断すると、自動的にopengles 2.0のAPIを呼び出します。

実現プロセス:

1.マニフェストでopengles 3.0の使用を宣言します。

プログラムでテクスチャ圧縮を使用する場合、これらの圧縮形式をサポートしていないデバイスがプログラムを実行しようとするのを防ぐために、以下の宣言も必要です。

2、GLSurfaceViewとGLSurfaceViewという2つの重要なクラスの実装。

GLSurfaceViewクラスを継承するMySurfaceView.java

Javaコード

            package com.gl.gl30_vbos02; 
 
  import android.content.Context; 
  import android.opengl.GLSurfaceView; 
  import android.util.AttributeSet; 
  import android.view.MotionEvent; 
  public class MySurfaceView extends GLSurfaceView { 
  private final float TOUCH_SCALE_FACOTOR = 180.0f / 320; 
  private GLRender _render = new GLRender(); 
  private float _preX = 0.0f; 
  private float _preY = 0.0f; 
  public MySurfaceView(Context context) 
  { 
    スーパー; 
  // TODO Auto-generated constructor stub 
    setEGLContextClientVersion; 
      this.setRenderer(_render); 
    setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY); 
  } 
  public MySurfaceView(Context context, AttributeSet attrs) { 
    super(context, attrs); 
  // TODO Auto-generated constructor stub 
  } 
  @Override 
  public boolean onTouchEvent(MotionEvent event) { 
  // TODO Auto-generated method stub 
  float x = event.getX(); 
  float y = event.getY(); 
  switch (event.getAction()) 
  { 
  case MotionEvent.ACTION_MOVE: 
  float dx = x - _preX; 
  float dy = y - _preY; 
  _render.zrot = dx * TOUCH_SCALE_FACOTOR; 
  _render.xrot = dy * TOUCH_SCALE_FACOTOR; 
  this.requestRender(); 
    ブレーク; 
    デフォルト: 
    ブレーク; 
  } 
  _preX = x; 
  _preY = y; 
  return true; 
  } 
  } 

GLSurfaceView.Renderer:を実装したGLRender.java。

Javaコード

              package com.gl.gl30_vbos02; 
 
  import java.nio.FloatBuffer; 
  import javax.microedition.khronos.egl.EGLConfig; 
  import javax.microedition.khronos.opengles.GL10; 
  import android.opengl.          GLES30; 
  import android.opengl.GLSurfaceView.Renderer; 
  import android.opengl.  行列; 
  import android.util.  ログ; 
    //@TargetApi(18) 
  public class GLRender implements Renderer { 
  public float xrot, yrot, zrot; 
  private static final String TAG = "GLRender"; 
  private final float[] mProj  行列 = new float[16]; 
  private final float[] mV  行列 = new float[16]; 
  private final float[] mMVPMatrix = new float[16]; 
  private final float[] mRotationMatrix = new float[16]; 
  // private volatile float mAngle; 
  private CirclePlane _circlePlane; 
    // 環境光を定義する 
  private FloatBuffer lightAmbient = FloatBuffer.wrap(new float[]{0.5f, 0.5f, 
0.5f, 1.0f}); 
    //拡散散乱を定義する 
  private FloatBuffer lightDiffuse = FloatBuffer.wrap(new float[]{1.0f, 1.0f, 
1.0f, 1.0f}); 
    //光源の位置 
  private FloatBuffer lightPosition = FloatBuffer.wrap(new float[]{0.0f, 
0.0f, 2.0f, 1.0f}); 
  public GLRender() { 
  // TODO Auto-generated constructor stub 
  } 
  @Override 
  public void onDrawFrame(GL10 gl_unused) { 
  // TODO Auto-generated method stub 
    // スクリーンと深度キャッシュをクリアする 
  GLES30.glClear(GLES30.GL_COLOR_BUFFER_BIT | 
GLES30.GL_DEPTH_BUFFER_BIT); 
  Matrix.setLookAtM(mVMatrix, 0, 0, 0, -3, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 
0.0f); 
  Matrix.multiplyMM(mMVPMatrix, 0, mProjMatrix, 0, mVMatrix, 0); 
      this._circlePlane.Draw(mMVPMatrix); 
  } 
  @Override 
  public void onSurfaceChanged(GL10 gl_unused, int width, int height) { 
  // TODO Auto-generated method stub 
  float ratio = (float) width / height; 
    //OPENGLビューポートを設定する。 
  GLES30.glViewport(0, 0, width, height); 
    //行列投影パラメータを設定する 
  Matrix.frustumM(mProjMatrix, 0, -ratio, ratio, -1, 1, 3, 7); 
  } 
  @Override 
  public void onSurfaceCreated(GL10 gl, EGLConfig config) { 
  // TODO Auto-generated method stub 
  //black background 
  GLES30.glClearColor(0.0f, 0.0f, 0.0f, 0.0f); 
  this._circlePlane = new CirclePlane(10, 20, 1.0f); 
  } 
  public static int loadShader(int type, String shaderCode) 
  { 
  // create a shader type (GLES30.GL_VERTEX_SHADER) 
  // or a fragment shader type (GLES30.GL_FRAGMENT_SHADER) 
  int shader = GLES30.glCreateShader(type); 
  GLES30.glShaderSource(shader, shaderCode); 
  GLES30.glCompileShader(shader); 
  return shader; 
  } 
  public static void checkGLError(String glOperation) 
  { 
  int error; 
    while((error = GLES30.glGetError()) != (GLES30.GL_NO_ERROR)) 
  { 
  Log.e(TAG, glOperation + ": glError " + error); 
  throw new RuntimeException(glOperation + ": glError " + error); 
  } 
  } 
  } 

Opengl esプロジェクトを完成させるには、上記の2つのクラスを実装することが最も重要です。さらに、このプログラムには、図のパターンを描くための4つのクラスがあります。:

CirclePlane.java // 頂点キャッシュのパターンを実装し、このクラスは、より多くの数学的な知識を持っていますが、パターンの実装のためだけで、問題が大丈夫である数学的アルゴリズムを理解する必要はありません。ちょうど別のパターンを描画するには、このクラスを変更します。

Vertex3f.java // 頂点タイプを定義します。

Until.java // 頂点キャッシュ生成用パブリックユーティリティクラス

OpenGLES30.java // プロジェクトのメインクラス

Read next

アジャイル開発の理由

アジャイル開発に関連する情報を概観し、私が長期にわたってアジャイル開発を実践してきたことと合わせて、アジャイル開発の本質について考えてみたいと思います。本稿では、アジャイル開発の核心を整理し、そこからその価値を導き出すつもりです。このレンガを投げることで、玉の輿に乗れることを願っています。

May 22, 2014 · 6 min read