素人のアンドロイドアプリ開発日記

OpenGLのコンテンツ

Android OpenGL 最初の一歩用Tips(1.1)

2012.01.13

今回はOpenGLをはじめるに当たって、チップスとしては点在しているのだけど、
意味がなんとなくわからないものをまとめてみました。

※勉強しながらの部分です。間違っていたら申し訳ありません。

 

■毎描画の初期化

openGLで、毎フレームで描画を行うが、その度に新しい描画にする為、最初に全体を特定の色で描画するなどの対処が必要

gl.glClear(GL10._GL_COLOR_BUFFER_BIT);

で画面の全体を黒に塗る事ができる。

色を変更する場合は

//glColor(R,G,B,alpha);
gl.glColor(0,0,1.0f,0);
gl.glClear(GL10._GL_COLOR_BUFFER_BIT);

としてglColorを設定する事で任意の色で塗る事が可能

 

■描画用メソッド

OpenGLには、さまざまな形を表示するメソッドが存在。

GL_LINES:独立した線

GL_LINE_STRIP:連続した直線

GL_LINE_LOOP:最初と最後の点が結ばれた連続した線

GL_TRIANGLES:三角形を書く
(a,b,c,d,e,f,g,h,i);
のような配列に対して
(a,b,c)(d,e,f)(g,h,i)
のようなセットで三角形を作成

GL_TRIANGLE_STRIP:三角形を書く
(a,b,c,d,e,f,g,h,i);
のような配列に対して
(a,b,c)(b,c,d)(c,d,e)(d,e,f)(e,f,g)(f,g,h)(g,h,i);
のような三角形を作成(つながった三角形ができる。)

GL_TRIANGLE_FAN:三角形を書く
(a,b,c,d,e,f,g,h,i);
のような配列に対して
(a,b,c)(a,c,d)(a,d,e)(a,e,f)(a,f,g)(a,g,h)(a,h,i)
のような三角形を作成(つながった三角形ができる。)

GL_QUADS:四角形を書く

GL_QUADS_STRIP:四角形を書く

GL_POLYGON:多角形を書く。

上記で、図形がいろいろと描けるのだが、GL_QUADS、GL_POLYGONに関しては、内側の内角が180度を超える図形を描く事ができない。
また、動作の処理に関しても重い事があり、多くの場合はGL_TRIANGLESを利用して図形を描く。

 

■3D表示用の準備

3Dを扱う場合
glFrustrum:遠くのものは小さく、近くのものは大きく
glOrtho:遠近はない代わりに断面的な表示ができる。

glTranslatef(x,y):平行移動
glRotatef(x,y,z):回転
glScalef(x,y,z):スケールの変更

 

■3D表示を行う場合の質感について

Ambient:照らされ方
Diffuse:拡散光
Speculear:金属的な感じ
Shiniess:光の反射具合
Emission:発光

 

■テクスチャの使用の仕方。

step1.

Bitmapの用意

Bitmap bmp = ***;

 

step2.

テクスチャの準備

gl.glGemTextures(1,textureArray,0);
gl.glBindTexture(GL10.GL_TEXTURE_2D,textureArray[0]);
//textureArrayはintの配列。

step3.

テクスチャを適用

GLUtils.texImage2D(GL10.GL_TEXTURE_2D,0,bmp,0);

また、下記の設定もする事ができるようです。

GL_TEXTUREMIN_FILTER:テクスチャが縮小される場合
GL_TEXTURE_MAG_FILTER:テクスチャが拡大する場合

での表示の仕方を下記のどちらかに設定する。

GL_LINEER:色の変わり目を滑らかにする。
GL_NEAREST:色の変わり目をぱっつんとする。

 

上記のでは、少しわかりずらい部分ではありましたが、後ほど、理解が深まった時点でキャッチアップしてみたいと思います。

 

カテゴリー:OpenGL

OpenGLを使ってみる。(1.1)

2012.01.05

今回からは数回OpenGLを利用してみたいと思います。

OpenGLとは描画をするのに優れたクラスですが、もっとも大きなポイントとしては、他のデバイス(iphoneや、PCなど)でも、OpenGLを用いて描画を出来るプログラムを持っている可能性が多いことです。

特にiphoneに関しては、同じプログラムを使う事が出来る為、ゲームの開発などに、利用をする事で、ほぼ同じ動きを実現できるそうです。(一部、スペックの違いや、用意されている関数の違いがあるようです。)

手順としては、
1、Activityを用意する。
2、レンダリングのクラスを用意する。
3、surfaceviewにレンダリングのクラスを組み合わせて中にいれる。

で、作成できます。

 

レンダリングのクラスは
GLSurfaceView.Rendererを継承したクラスなので

public class MyRenderer implements GLSurfaceView.Renderer{
 public void onDrawFrame(GL10 gl) {}
 public void onSurfaceChanged(GL10 gl, int width, int height) {}
 public void onSurfaceCreated(GL10 gl, EGLConfig config) {}
}

上記の3つの関数を用意する必要があります。

Activityクラス(onCreate)では下記のように、Surfaceviewを作成して、それにrendererを組み合わせます。

MyRenderer _renderer = new MyRenderer();
GLSurfaceView _glSurfaceView = new GLSurfaceView(this);
_glSurfaceView.setRenderer(_renderer);
setContentView(_glSurfaceView);

これでカンタンにOpenGLの表示ができてるのですが、中には何も表示されていません。

 

次に三角形を書いてみましょう。

■onSurfaceCreatedへの設定

三角形を書くために各頂点を表すvertexを利用できるようにします。

gl10.glEnableClientState(GL10.GL_VERTEX_ARRAY);

各頂点を表す座標を決めます。

float[] vertexs={
 0.0f,1.0f,
 0.0f,0.0f,
 1.0f,0.0f
};

上記は点1(0,1)、点2(0,0)、点3(1,0)の3点の座標の集まりです。ここでの単位に関しては、自分で決める事のできる単位になります。が、特に何も設定していない場合は、左下が(0,0)で右上が(1,1)となります。

また、少し複雑にはなるのですが、OpenGLではCPU領域をActivityから受け継ぐ事が出来ない為、独自に設定をしてあげる必要があります。(座標のデータを保持しておくためのメモリスペースの確保をしてあげたい。)

下記のような外部クラスを作成しても、内部に関数を容易してもよいのですが、FloatBufferの値が返る関数に配列をメモリに変換してもらいます。

public class GraphicUtil{
 public static final FloatBuffer makeFloadtBuffer(float[] arr){
 ByteBuffer bb = ByteBuffer.allocateDirect(arr.length*4);
 bb.order(ByteOrder.nativeOrder());
 FloatBuffer fb = bb.asFloatBuffer();
 fb.put(arr);
 fb.position(0);
 return fb;
 }
}
vertexBuffer=GraphicUtil.makeFloatBuffer(vertexs);

※上記に関して、配列の長さに4をかけているのはfloatが、1文字4byteの為です。

 

■onSurfaceChangedへの設定

ウインドウのサイズが変更された際また、動作の最初に実行される為、表示の領域をここで指定をします。

gl.glViewport(0,0,width,height);

width,heightはonSurfaceChangedの引数として得られる値を登録します。

 

■onDrawFrameへの設定
基本的に、この関数が毎回実行されるので、
毎回描画を行うなどします。

gl.glClearColor(0.5f,0.5f,0.5f,1.0f);
gl.glClear(GL10.GL_COLOR_BUFFER_BIT);

上記で背景色を設定します。glClearColorでは、RGBAを設定できます。glClearColorで設定した色がステージ全体に描画されます。

色を指定します。

gl.glColor4f(1.0f,0.0f,0.0f,1.0f);

ここで、配列の値から取得したバッファーのメモリ分を登録します。

gl.glVertexPointer(2,GL10.GL_FLOAT,0,vertexBuffer);

ここで描画(2つ目の引数はoffsetの為利用頻度はすくない、3つめの引数は頂点の数。)

gl.glDrawArrays(GL10.GL_TRIANGLES,0,3);

 

上記で三角形の表示の為に必要な一通りの関数を説明しました。(具体例は時間がある時に貼り付けます。)

 

 

カテゴリー:OpenGL

公開中のアプリ、是非ダウンロードしてみてください

2chまとめのたね

RSSを利用してさまざまなブログの情報をキュレーションしてくれるアプリ

インストールする

ひらがな戦記

OPENGL ES2 を利用したカルタのソーシャルゲーム

インストールする