現在、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 // プロジェクトのメインクラス