▼Androidメモ▼
OpenGLによる3Dグラフィックス


OpenGLによる3Dグラフィックスの描画を行うプログラムを作成する。
参考リンク
書籍
opengl.jpg

チュートリアル1
背景を黒で塗り潰すOpenGLプログラムを作成する。



GLTutorialOne.java
package edu.union;
import javax.microedition.khronos.opengles.*;
import android.content.*;

//チュートリアル1
public class GLTutorialOne extends GLTutorialBase {
//コンストラクタ
public GLTutorialOne(Context c) {
super(c);
}

//初期化
protected void init(GL10 gl) {
//背景塗り潰し色の指定
gl.glClearColor(0,0,0,1);

//カラーとテクスチャ座標の補間精度-高速
gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT,GL10.GL_FASTEST);
}

//描画
protected void drawFrame(GL10 gl) {
//背景塗り潰し
gl.glClear(GL10.GL_COLOR_BUFFER_BIT|GL10.GL_DEPTH_BUFFER_BIT);
}
}

GL10メソッド 説明
void glClear(int mask) 背景塗り潰し
maskには塗り潰すバッファを指定

mask定数 説明
GL_COLOR_BUFFER_BIT カラーバッファ
GL_DEPTH_BUFFER_BIT デプスバッファ
GL_STENCIL_BUFFER_BIT ステンシルバッファ
void glClearColor(float red, float green, float blue, float alpha) 背景塗り潰し色の指定。
RGBとα値を0〜1の値で指定
void glClearColorx(int red, int green, int blue, int alpha)
void glHint(int target, int mode) クォリティを設定
targetに対象、modeにクォリティを指定

target定数 説明
GL_FOG_HINT ファグの計算精度
GL_LINE_SMOOTH_HINT 線のサンプリング精度
GL_PERSPECTIVE_CORRECTION_HINT カラーとテクスチャ座標の補間精度
GL_POINT_SMOOTH_HINT 点のサンプリング精度
GL_POLYGON_SMOOTH_HINT ポリゴンのサンプリング精度
GL_FASTEST 効率的
GL_NICEST 高品質
GL_DONT_CARE なし

mode定数 説明
GL_FASTEST 効率的
GL_NICEST 高品質
GL_DONT_CARE なし


チュートリアル2
赤いプリミティブを表示するOpenGLプログラムを作成する。



GLTutorialTwo.java
package edu.union;
import java.nio.*;
import javax.microedition.khronos.opengles.*;
import android.content.*;
import android.opengl.*;

//チュートリアル2
public class GLTutorialTwo extends GLTutorialBase {
float[] square=new float[] {//頂点
-0.25f,-0.25f,0.0f,
0.25f,-0.25f,0.0f,
-0.25f, 0.25f,0.0f,
0.25f, 0.25f,0.0f};
FloatBuffer squareBuff;//頂点バッファ

//コンストラクタ
public GLTutorialTwo(Context c) {
super(c);

//頂点バッファの生成
squareBuff=makeFloatBuffer(square);
}

//初期化
protected void init(GL10 gl) {
//背景塗り潰し色の指定
gl.glClearColor(0.0f,0.0f,0.0f,1.0f);

//射影行列の指定
gl.glMatrixMode(GL10.GL_PROJECTION);
gl.glLoadIdentity();
GLU.gluOrtho2D(gl,0.0f,1.2f,0.0f,1.0f);//平行投影
}

//描画
protected void drawFrame(GL10 gl) {
//背景塗り潰し
gl.glClear(GL10.GL_COLOR_BUFFER_BIT|GL10.GL_DEPTH_BUFFER_BIT);

//モデルビュー行列の指定
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glLoadIdentity();
gl.glTranslatef(0,0,-1);//平行移動

//色の指定
gl.glColor4f(1,0,0,0.5f);

//頂点配列の指定
gl.glVertexPointer(3,GL10.GL_FLOAT,0,squareBuff);
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);

//プリミティブの描画
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP,0,4);
}
}

GL10メソッド 説明
void glMatrixMode(int mode) 行列演算ターゲットの指定

mode定数 説明
GL_MODELVIEW モデルビュー行列
GL_PROJECTION 射影行列
GL_TEXTURE テクスチャ行列
void glLoadIdentity() 行列の初期化


void glTranslatef(float x, float y, float z) モデルの平行移動
void glTranslatex(int x, int y, int z)
void glScalef(float x, float y, float z) モデルのスケーリング
void glScalex(int x, int y, int z)
void glRotatef(float angle, float x, float y, float z) モデルの回転
void glRotatex(int angle, int x, int y, int z)


void glColor4f(float red, float green, float blue, float alpha) モデル色の指定 
void glColor4x(int red, int green, int blue, int alpha)
void glEnableClientState(int array) 配列の有効化

array定数 説明
GL_COLOR_ARRAY カラー配列
glColorPointer()参照
GL_NORMAL_ARRAY 法線配列
glNormalPointer()参照
GL_TEXTURE_COORD_ARRAY テクスチャ座標配列
glTexCoordPointer()参照
GL_VERTEX_ARRAY 頂点配列
glVertexPointer()参照
void glColorPointer(int size, int type, int stride, Buffer pointer) 配列の値の指定
sizeに座標情報数、typeに型、strideにバイトのオフセット、pointerに値を指定

type定数 説明
GL_SHORT short型
GL_FLOAT float型
void glNormalPointer(int type, int stride, Buffer pointer)
void glTexCoordPointer(int size, int type, int stride, Buffer pointer)
void glVertexPointer(int size, int type, int stride, Buffer pointer)
void glDrawArrays(int mode, int first, int count) 配列の描画
modeに種別、firstに開始位置、countに数を指定

mode定数 説明
GL_POINTS
GL_LINES ライン
GL_LINE_STRIP 折れ線
GL_TRIANGLES 三角形
GL_QUADS 四角形
GL_TRIANGLE_STRIP 1辺を共有しながら帯状に三角形
GL_QUAD_STRIP 1辺を共有しながら帯状に四角形
GL_TRIANGLE_FAN 1辺を共有しながら扇状に三角形
GL_POLYGON ポリゴン

GLUメソッド 説明
static String gluErrorString(int error) エラーメッセージの取得
static void gluLookAt(GL10 gl, float eyeX, float eyeY, float eyeZ, float centerX, float centerY, float centerZ, float upX, float upY, float upZ) 視点・参照点・UPベクトルによるビューイング変換の定義
static void gluOrtho2D(GL10 gl, float left, float right, float bottom, float top) 平行投影の設定
static void gluPerspective(GL10 gl, float fovy, float aspect, float zNear, float zFar) 透視投影の設定
static int gluProject(float objX, float objY, float objZ, float[] model, int modelOffset, float[] project, int projectOffset, int[] view, int viewOffset, float[] win, int winOffset) モデル座標をウィンドウ座標に変換 
static int gluUnProject(float winX, float winY, float winZ, float[] model, int modelOffset, float[] project, int projectOffset, int[] view, int viewOffset, float[] obj, int objOffset) ウィンドウ座標をモデル座標に変換
 


チュートリアル3
頂点カラーを利用してプリミティブを表示するOpenGLプログラムを作成する。



GLTutorialThree.java
package edu.union;
import java.nio.*;
import javax.microedition.khronos.opengles.*;
import android.content.*;
import android.opengl.*;

//チュートリアル3
public class GLTutorialThree extends GLTutorialBase {
//頂点座標
float[] triangle=new float[] {
-0.25f,-0.25f, 0.0f,
0.25f,-0.25f, 0.0f,
-0.25f, 0.25f, 0.0f};

//頂点色
float[] colors=new float[] {
1, 0, 0, 1,
0, 1, 0, 1,
0, 0, 1, 1};

FloatBuffer triangleBuff;//頂点座標バッファ
FloatBuffer colorBuff; //頂点色バッファ

//コンストラクタ
public GLTutorialThree(Context c) {
super(c);

//バッファの生成
triangleBuff=makeFloatBuffer(triangle);
colorBuff =makeFloatBuffer(colors);
}

//初期化
protected void init(GL10 gl) {
//背景塗り潰し色の指定
gl.glClearColor(0.0f,0.0f,0.0f,0.0f);

//射影行列の指定
gl.glMatrixMode(GL10.GL_PROJECTION);
gl.glLoadIdentity();
GLU.gluOrtho2D(gl,0.0f,1.3f,0.0f,1.0f);

//背景塗り潰し
gl.glClear(GL10.GL_COLOR_BUFFER_BIT);

//シェーディングの指定
gl.glShadeModel(GL10.GL_SMOOTH);
}

//描画
protected void drawFrame(GL10 gl) {
//背景塗り潰し
gl.glClear(GL10.GL_COLOR_BUFFER_BIT|GL10.GL_DEPTH_BUFFER_BIT);

//モデルビュー行列の指定
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glLoadIdentity();
gl.glTranslatef(0,0,-1);

//頂点配列の指定
gl.glVertexPointer(3,GL10.GL_FLOAT,0,triangleBuff);
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);

//色配列の指定
gl.glColorPointer(4, GL10.GL_FLOAT, 0, colorBuff);
gl.glEnableClientState(GL10.GL_COLOR_ARRAY);

//プリミティブの描画
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP,0,3);
}
}

GL10メソッド 説明
void glShadeModel(int mode) シェーディングの指定

mode定数 説明
GL_SMOOTH 隣り合う頂点に異なる色が指定された時、なめらかにグラデーション表示
GL_FLAT 隣り合う頂点に異なる色が指定された時、補間をしないで異なる色で表示


チュートリアル4
複数の回転するプリミティブを表示するOpenGLプログラムを作成する。



GLTutorialFour.java
package edu.union;
import java.nio.*;
import javax.microedition.khronos.opengles.*;
import android.content.*;
import android.opengl.*;

//チュートリアル4
public class GLTutorialFour extends GLTutorialBase {
//三角形の頂点座標
float[] triangle=new float[] {
-0.25f,-0.25f, 0.0f,
0.25f,-0.25f, 0.0f,
-0.25f, 0.25f, 0.0f};

//三角形の頂点色
float[] colors=new float[] {
1, 0, 0, 1,
0, 1, 0, 1,
0, 0, 1, 1};

//四角形の頂点座標
float[] square=new float[] {
-0.25f, -0.25f, 0.0f,
0.25f, -0.25f, 0.0f,
-0.25f, 0.25f, 0.0f,
0.25f, 0.25f, 0.0f};

FloatBuffer triangleBuff;//三角形の頂点座標バッファ
FloatBuffer colorBuff; //三角形の頂点色バッファ
FloatBuffer squareBuff; //四角形の頂点座標バッファ

float xrot=0.0f;//X軸回転量
float yrot=0.0f;//Y軸回転量

//コンストラクタ
public GLTutorialFour(Context c) {
super(c,20);

//バッファの生成
squareBuff =makeFloatBuffer(square);
triangleBuff=makeFloatBuffer(triangle);
colorBuff =makeFloatBuffer(colors);
}

//初期化
protected void init(GL10 gl) {
//背景塗り潰し色の指定
gl.glClearColor(0.0f,0.0f,0.0f,1.0f);

//射影行列の指定
gl.glMatrixMode(GL10.GL_PROJECTION);
gl.glLoadIdentity();
GLU.gluOrtho2D(gl,0.0f,1.3f,0.0f,1.0f);

//シェーディングの指定
gl.glShadeModel(GL10.GL_SMOOTH);
}

//描画
protected void drawFrame(GL10 gl) {
//回転
xrot+=1f;
yrot+=1f;

//背景塗り潰し
gl.glClear(GL10.GL_COLOR_BUFFER_BIT|GL10.GL_DEPTH_BUFFER_BIT);

//モデルビュー行列の指定
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glLoadIdentity();

//現在のモデルビュー行列を記憶
gl.glPushMatrix();

//三角形の平行移動と回転
gl.glTranslatef(-0.25f,0.0f,-2f);
gl.glRotatef(xrot,1.0f,0.0f,0.0f);

//三角形の頂点座標バッファの指定
gl.glVertexPointer(3,GL10.GL_FLOAT,0,triangleBuff);
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);

//三角形の頂点色バッファの指定
gl.glColorPointer(4,GL10.GL_FLOAT,0,colorBuff);
gl.glEnableClientState(GL10.GL_COLOR_ARRAY);

//三角形のプリミティブの描画
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP,0,3);

//記憶しているモデルビュー行列に戻す
gl.glPopMatrix();

//頂点色の無効化
gl.glDisableClientState(GL10.GL_COLOR_ARRAY);

//四角形の平行移動と回転
gl.glTranslatef(0.25f,0.0f,-2f);
gl.glRotatef(yrot,0,1,0);

//四角形の頂点バッファの指定
gl.glVertexPointer(3,GL10.GL_FLOAT,0,squareBuff);

//四角形の色の指定
gl.glColor4f(0.25f,0.25f,0.75f,1.0f);

//四角形のプリミティブの描画
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP,0,4);
}
}

GL10メソッド 説明
void glPushMatrix() 現在のモデルビュー行列を記憶
void glPopMatrix() 記憶しているモデルビュー行列に戻す


チュートリアル5
デプスバッファを利用してプリミティブを表示するOpenGLプログラムを作成する。



GLTutorialFive.java
package edu.union;
import java.nio.*;
import javax.microedition.khronos.opengles.*;
import android.content.*;
import android.opengl.*;

//チュートリアル5
public class GLTutorialFive extends GLTutorialBase {
//頂点座標
float[] triangle=new float[] {
-0.25f,-0.25f, 0.0f,
0.25f,-0.25f, 0.0f,
-0.25f, 0.25f, 0.0f};

//頂点色
float[] colors=new float[] {
1, 0, 0, 1,
0, 1, 0, 1,
0, 0, 1, 1};

FloatBuffer triangleBuff;//頂点座標バッファ
FloatBuffer colorBuff; //頂点色バッファ

//コンストラクタ
public GLTutorialFive(Context c) {
super(c);

//バッファの生成
triangleBuff=makeFloatBuffer(triangle);
colorBuff =makeFloatBuffer(colors);
}

//初期化
protected void init(GL10 gl) {
//背景塗り潰し色の指定
gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);

//射影行列の指定
gl.glMatrixMode(GL10.GL_PROJECTION);
gl.glLoadIdentity();
GLU.gluOrtho2D(gl,0.0f,1.3f,0.0f,1.0f);

//デプスバッファの指定
gl.glEnable(GL10.GL_DEPTH_TEST);
gl.glDepthFunc(GL10.GL_LEQUAL);
gl.glClearDepthf(1.0f);

//シェーダーの指定
gl.glShadeModel(GL10.GL_SMOOTH);
}

//描画
protected void drawFrame(GL10 gl) {
//背景塗り潰し
gl.glClear(GL10.GL_COLOR_BUFFER_BIT|GL10.GL_DEPTH_BUFFER_BIT);

//モデルビュー行列の指定
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glLoadIdentity();
gl.glTranslatef(0,0,-1);
gl.glPushMatrix();

//頂点配列の指定
gl.glVertexPointer(3,GL10.GL_FLOAT,0,triangleBuff);
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);

//カラー配列の指定
gl.glColorPointer(4,GL10.GL_FLOAT,0,colorBuff);
gl.glEnableClientState(GL10.GL_COLOR_ARRAY);

//プリミティブの描画
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP,0,3);
gl.glPopMatrix();

//プリミティブの描画
gl.glPushMatrix();
gl.glTranslatef(-0.2f,-.1f,-1.0f);
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP,0,3);
gl.glPopMatrix();

//プリミティブの描画
gl.glPushMatrix();
gl.glTranslatef(0.1f,0.1f,-0.5f);
gl.glRotatef(45.0f,0,0,1);
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP,0,3);
gl.glPopMatrix();

//プリミティブの描画
gl.glTranslatef(0.15f,0.05f,-0.4f);
gl.glRotatef(45,0,1,0);
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP,0,3);
gl.glPopMatrix();
}
}

GL10メソッド 説明
void glEnable(int cap) 機能を有効にする

cap定数 説明
GL_BLEND ブレンド
GL_CULL_FACE 片面表示
GL_DEPTH_TEST デプステスト
GL_LIGHTING ライティング
GL_LIGT0〜7 光源0〜7

GL_LINE_SMOOTH

ラインのアンチエイリアス

GL_POINT_SMOOTH

点のアンチエイリアス

GL_POLYGON_SMOOTH

ポリゴンのアンチエイリアス
GL_TEXTURE_2D テクスチャ
void glDisable(int cap) 機能を無効にする


void glDepthFunc(int func) ピクセルの深度値と深度バッファーの深度値を比較する関数を指定

func定数 説明
GL_NEVER 常に通過しない
GL_LESS 入って来る深度値が格納された深度値未満である時に通過
GL_EQUAL 入って来る深度値が格納された深度値と同等の時に通過
GL_LEQUAL 入って来る深度値が格納された深度値以下である時に通過
GL_GREATER 入って来る深度値が格納された深度値より大きな時に通過
GL_NOTEQUAL 入って来る深度値が格納された深度値と同等でない時に通過
GL_GEQUAL 入って来る深度値が、格納された深度値以上ある時に通過
GL_ALWAYS 常に通過
void glClearDepthf(float depth) 深度バッファーをクリアする時にしようする奥行き値を指定
初期値は1
void glClearDepthx(int depth)


チュートリアル6
立方体のプリミティブを表示するOpenGLプログラムを作成する。



GLTutorialSix.java
package edu.union;
import java.nio.*;
import javax.microedition.khronos.opengles.*;
import android.content.*;
import android.opengl.*;

//チュートリアル6
public class GLTutorialSix extends GLTutorialBase {
float box[]=new float[] {
//前面
-0.5f, -0.5f, 0.5f,
0.5f, -0.5f, 0.5f,
-0.5f, 0.5f, 0.5f,
0.5f, 0.5f, 0.5f,
//背面
-0.5f, -0.5f, -0.5f,
-0.5f, 0.5f, -0.5f,
0.5f, -0.5f, -0.5f,
0.5f, 0.5f, -0.5f,
//左面
-0.5f, -0.5f, 0.5f,
-0.5f, 0.5f, 0.5f,
-0.5f, -0.5f, -0.5f,
-0.5f, 0.5f, -0.5f,
//右面
0.5f, -0.5f, -0.5f,
0.5f, 0.5f, -0.5f,
0.5f, -0.5f, 0.5f,
0.5f, 0.5f, 0.5f,
//上面
-0.5f, 0.5f, 0.5f,
0.5f, 0.5f, 0.5f,
-0.5f, 0.5f, -0.5f,
0.5f, 0.5f, -0.5f,
//下面
-0.5f, -0.5f, 0.5f,
-0.5f, -0.5f, -0.5f,
0.5f, -0.5f, 0.5f,
0.5f, -0.5f, -0.5f,
};

FloatBuffer cubeBuff;//頂点座標バッファ

float xrot=0.0f;//X軸回転量
float yrot=0.0f;//Y軸回転量

//コンストラクタ
public GLTutorialSix(Context c) {
super(c,20);

//バッファの生成
cubeBuff=makeFloatBuffer(box);
}

//初期化
protected void init(GL10 gl) {
//背面塗り潰し色の指定
gl.glClearColor(0.0f,0.0f,0.0f,1.0f);

//デプスバッファ
gl.glEnable(GL10.GL_DEPTH_TEST);
gl.glEnable(GL10.GL_CULL_FACE);
gl.glDepthFunc(GL10.GL_LEQUAL);
gl.glClearDepthf(1.0f);

//シェーディング
gl.glShadeModel(GL10.GL_SMOOTH);
}

//描画
protected void drawFrame(GL10 gl) {
//背面塗り潰し
gl.glClear(GL10.GL_COLOR_BUFFER_BIT|GL10.GL_DEPTH_BUFFER_BIT);

//モデルビュー行列の指定
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glLoadIdentity();
GLU.gluLookAt(gl,0,0,3,0,0,0,0,1,0);

//頂点配列の指定
gl.glVertexPointer(3,GL10.GL_FLOAT,0,cubeBuff);
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);

//回転の指定
gl.glRotatef(xrot,1,0,0);
gl.glRotatef(yrot,0,1,0);

//前面と背面のプリミティブの描画
gl.glColor4f(1.0f,0,0,1.0f);
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP,0,4);
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP,4,4);

//左面と右面のプリミティブの描画
gl.glColor4f(0,1.0f,0,1.0f);
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP,8,4);
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP,12,4);

//上面と下面のプリミティブの描画
gl.glColor4f(0,0,1.0f,1.0f);
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP,16,4);
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP,20,4);

//回転
xrot+=1.0f;
yrot+=0.5f;
}
}


チュートリアル7
光源を利用して立方体のプリミティブを表示するOpenGLプログラムを作成する。



GLTutorialFive.java
package edu.union;
import java.nio.*;
import javax.microedition.khronos.opengles.*;
import android.content.*;
import android.opengl.*;

//チュートリアル7
public class GLTutorialSeven extends GLTutorialBase {
float[] lightAmbient=new float[]{0.2f,0.3f,0.6f,1.0f };//光源アンビエント
float[] lightDiffuse=new float[]{0.2f,0.3f,0.6f,1.0f };//光源ディフューズ
float[] lightPos =new float[]{0,0,3,1}; //光源位置
float[] matAmbient =new float[]{0.6f,0.6f,0.6f,1.0f };//マテリアルアンビエント
float[] matDiffuse =new float[]{0.6f,0.6f,0.6f,1.0f };//マテリアルディフューズ

float box[]=new float[] {//頂点座標
//前面
-0.5f, -0.5f, 0.5f,
0.5f, -0.5f, 0.5f,
-0.5f, 0.5f, 0.5f,
0.5f, 0.5f, 0.5f,
//背面
-0.5f, -0.5f, -0.5f,
-0.5f, 0.5f, -0.5f,
0.5f, -0.5f, -0.5f,
0.5f, 0.5f, -0.5f,
//左面
-0.5f, -0.5f, 0.5f,
-0.5f, 0.5f, 0.5f,
-0.5f, -0.5f, -0.5f,
-0.5f, 0.5f, -0.5f,
//右面
0.5f, -0.5f, -0.5f,
0.5f, 0.5f, -0.5f,
0.5f, -0.5f, 0.5f,
0.5f, 0.5f, 0.5f,
//上面
-0.5f, 0.5f, 0.5f,
0.5f, 0.5f, 0.5f,
-0.5f, 0.5f, -0.5f,
0.5f, 0.5f, -0.5f,
//した面
-0.5f, -0.5f, 0.5f,
-0.5f, -0.5f, -0.5f,
0.5f, -0.5f, 0.5f,
0.5f, -0.5f, -0.5f,
};

float norms[]=new float[] {//頂点法線
//上面
0f, 0f, 1f,
0f, 0f, 1f,
0f, 0f, 1f,
0f, 0f, 1f,
//下面
0f, 0f, -1f,
0f, 0f, -1f,
0f, 0f, -1f,
0f, 0f, -1f,
//左面
-1f, 0f, 0f,
-1f, 0f, 0f,
-1f, 0f, 0f,
-1f, 0f, 0f,
//右面
1f, 0f, 0f,
1f, 0f, 0f,
1f, 0f, 0f,
1f, 0f, 0f,
//上面
0f, 1f, 0f,
0f, 1f, 0f,
0f, 1f, 0f,
0f, 1f, 0f,
//下面
0f, -1f, 0f,
0f, -1f, 0f,
0f, -1f, 0f,
0f, -1f, 0f
};

FloatBuffer cubeBuff;//頂点座標バッファ
FloatBuffer normBuff;//頂点法線バッファ

float xrot=0.0f;//X軸回転量
float yrot=0.0f;//Y軸回転量

//コンストラクタ
public GLTutorialSeven(Context c) {
super(c, 20);

//バッファの生成
cubeBuff=makeFloatBuffer(box);
normBuff=makeFloatBuffer(norms);
}

//初期化
protected void init(GL10 gl) {
//ライティングの指定
gl.glEnable(GL10.GL_LIGHTING);
gl.glEnable(GL10.GL_LIGHT0);
gl.glMaterialfv(GL10.GL_FRONT_AND_BACK,GL10.GL_AMBIENT,matAmbient,0);
gl.glMaterialfv(GL10.GL_FRONT_AND_BACK,GL10.GL_DIFFUSE,matDiffuse,0);
gl.glLightfv(GL10.GL_LIGHT0,GL10.GL_AMBIENT,lightAmbient,0);
gl.glLightfv(GL10.GL_LIGHT0,GL10.GL_DIFFUSE,lightDiffuse,0);
gl.glLightfv(GL10.GL_LIGHT0,GL10.GL_POSITION,lightPos,0);

//デプスバッファの指定
gl.glEnable(GL10.GL_DEPTH_TEST);
gl.glDepthFunc(GL10.GL_LEQUAL);

//片面スムーズシェーディングの指定
gl.glEnable(GL10.GL_CULL_FACE);
gl.glShadeModel(GL10.GL_SMOOTH);

//背景のクリア
gl.glClearColor(0.0f,0.0f,0.0f,0.0f);
gl.glClearDepthf(1.0f);

//頂点配列の指定
gl.glVertexPointer(3,GL10.GL_FLOAT,0,cubeBuff);
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);

//法線配列の指定
gl.glNormalPointer(GL10.GL_FLOAT,0,normBuff);
gl.glEnableClientState(GL10.GL_NORMAL_ARRAY);
}

//描画
protected void drawFrame(GL10 gl) {
//背景塗り潰し
gl.glClear(GL10.GL_COLOR_BUFFER_BIT|GL10.GL_DEPTH_BUFFER_BIT);

//モデルビュー行列の指定
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glLoadIdentity();
GLU.gluLookAt(gl,0,0,3,0,0,0,0,1,0);

//回転の指定
gl.glRotatef(xrot,1,0,0);
gl.glRotatef(yrot,0,1,0);

//前面と背面のプリミティブの描画
gl.glColor4f(1.0f,0,0,1.0f);
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP,0,4);
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP,4,4);

//左面と右面のプリミティブの描画
gl.glColor4f(0,1.0f,0,1.0f);
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP,8,4);
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP,12,4);

//上面と下面のプリミティブの描画
gl.glColor4f(0,0,1.0f,1.0f);
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP,16,4);
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP,20,4);

//回転
xrot+=1.0f;
yrot+=0.5f;
}
}

GL10メソッド 説明
void glMaterialf(int face, int pname, float param) マテリアルの指定
faceに材質適用部分、pnameに設定するマテリアル種類、paramsにパラメータを指定

face定数 説明
GL_FRONT 前面
GL_BACK 背面
GL_FRONT_AND_BACK 両面

pname定数 説明
GL_AMBIENT 環境光を4つの整数値、または浮動小数点値で指定
初期値(0.2,0.2,0.2,1)
GL_DIFFUSE 拡散光を4つの整数値、または浮動小数点値で指定
初期値GL_LIGHT0が(0.8,0.8,0.8,1)、それ以外は(0,0,0,0)
GL_SPECULAR 鏡面光を4つの整数値、または浮動小数点値で指定
初期値(0,0,0,1)
GL_EMISSION 放射輝度を4つの整数値、または浮動小数点値で指定
初期値(0,0,0,1)
GL_SHININESS 鏡面光の指数を単一の整数値、または浮動小数点値で指定
範囲は0〜128まで、初期値0

GL_AMBIENT_AND_DIFFUSE

環境光と拡散光を同時に指定
void glMaterialfv(int face, int pname, float[] params, int offset)
void glMaterialfv(int face, int pname, FloatBuffer params)
void glMaterialx(int face, int pname, int param)
void glMaterialxv(int face, int pname, int[] params, int offset)
void glMaterialxv(int face, int pname, IntBuffer params)


void glLightf(int light, int pname, float param) 光源の指定
lightにターゲットとする光源(GL_LIGHT0〜GL_LIGHT7)、pnameに光源パラメータ種別、paramにパラメータを指定

pname定数 説明
GL_AMBIENT 環境光を4つの整数値、または浮動小数点値で指定
初期値(0,0,0,1)
GL_DIFFUSE 拡散光を4つの整数値、または浮動小数点値で指定
初期値GL_LIGHT0が(1,1,1,1)、それ以外は(0,0,0,0)
GL_SPECULAR 鏡面光を4つの整数値、または浮動小数点値で指定
初期値GL_LIGHT0が(1,1,1,1)、それ以外は(0,0,0,0)
GL_POSITION 照明の位置を4つの整数値、または浮動小数点値で指定
初期値(0,0,1,0)
GL_SPOT_DIRECTION 照明の方向を3つの整数値、または浮動小数点値で指定
初期値(0,0,-1)
GL_SPOT_EXPONENT 輝度の分布を単独の整数値、または浮動小数点値で指定
初期値0
GL_SPOT_CUTOFF 最大放射角度を単独の整数値、または浮動小数点値で指定
範囲は0〜90までと、特別値の180のみが有効
初期値180
GL_CONSTANT_ATTENUATION 一定減衰の率を単独の整数値、または浮動小数点値で指定
初期値1
GL_LINEAR_ATTENUATION 線形減衰の率を単独の整数値、または浮動小数点値で指定
初期値0
GL_QUADRATIC_ATTENUATION 2次減衰の率を単独の整数値、または浮動小数点値で指定
初期値0
void glLightfv(int light, int pname, FloatBuffer params)
void void glLightfv(int light, int pname, float[] params, int offset)
void glLightx(int light, int pname, int param)
void glLightxv(int light, int pname, int[] params, int offset)
void glLightxv(int light, int pname, IntBuffer params)


チュートリアル8
テクスチャを利用して立方体のプリミティブを表示するOpenGLプログラムを作成する。



GLTutorialEight.java
package edu.union;
import java.nio.*;
import javax.microedition.khronos.opengles.*;
import android.content.*;
import android.graphics.*;
import android.opengl.*;

//チュートリアル8
public class GLTutorialEight extends GLTutorialBase {
float[] lightAmbient=new float[]{0.2f,0.2f,0.2f,1.0f};//光源アンビエント
float[] lightDiffuse=new float[]{1f,1f,1f,1.0f}; //光源ディフューズ
float[] lightPos =new float[]{0,0,3,1}; //光源位置

float[] matAmbient=new float[]{1f,1f,1f,1.0f};//マテリアルアンビエント
float[] matDiffuse=new float[]{1f,1f,1f,1.0f};//マテリアルディフューズ

int tex;//テクスチャ
Bitmap bmp;//ビットマップ

float box[]=new float[] {//頂点座標
//前面
-0.5f, -0.5f, 0.5f,
0.5f, -0.5f, 0.5f,
-0.5f, 0.5f, 0.5f,
0.5f, 0.5f, 0.5f,
//背面
-0.5f, -0.5f, -0.5f,
-0.5f, 0.5f, -0.5f,
0.5f, -0.5f, -0.5f,
0.5f, 0.5f, -0.5f,
//左面
-0.5f, -0.5f, 0.5f,
-0.5f, 0.5f, 0.5f,
-0.5f, -0.5f, -0.5f,
-0.5f, 0.5f, -0.5f,
//右面
0.5f, -0.5f, -0.5f,
0.5f, 0.5f, -0.5f,
0.5f, -0.5f, 0.5f,
0.5f, 0.5f, 0.5f,
//上面
-0.5f, 0.5f, 0.5f,
0.5f, 0.5f, 0.5f,
-0.5f, 0.5f, -0.5f,
0.5f, 0.5f, -0.5f,
//下面
-0.5f, -0.5f, 0.5f,
-0.5f, -0.5f, -0.5f,
0.5f, -0.5f, 0.5f,
0.5f, -0.5f, -0.5f,
};

float texCoords[]=new float[] {//頂点テクスチャ
//前面
0.0f, 0.0f,
1.0f, 0.0f,
0.0f, 1.0f,
1.0f, 1.0f,
//背面
1.0f, 0.0f,
1.0f, 1.0f,
0.0f, 0.0f,
0.0f, 1.0f,
//左面
1.0f, 0.0f,
1.0f, 1.0f,
0.0f, 0.0f,
0.0f, 1.0f,
//右面
1.0f, 0.0f,
1.0f, 1.0f,
0.0f, 0.0f,
0.0f, 1.0f,
//上面
0.0f, 0.0f,
1.0f, 0.0f,
0.0f, 1.0f,
1.0f, 1.0f,
//下面
1.0f, 0.0f,
1.0f, 1.0f,
0.0f, 0.0f,
0.0f, 1.0f
};

FloatBuffer cubeBuff;//頂点座標バッファ
FloatBuffer texBuff; //頂点テクスチャバッファ

float xrot=0.0f;//X軸回転量
float yrot=0.0f;//Y軸回転量

//コンストラクタ
public GLTutorialEight(Context c) {
super(c,20);

//ビットマップの読み込み
bmp=BitmapFactory.decodeResource(c.getResources(),R.drawable.icon);

//バッファの生成
cubeBuff=makeFloatBuffer(box);
texBuff =makeFloatBuffer(texCoords);
}

//初期化
protected void init(GL10 gl) {
//光源の指定
gl.glEnable(GL10.GL_LIGHTING);
gl.glEnable(GL10.GL_LIGHT0);
gl.glMaterialfv(GL10.GL_FRONT_AND_BACK,GL10.GL_AMBIENT,matAmbient,0);
gl.glMaterialfv(GL10.GL_FRONT_AND_BACK,GL10.GL_DIFFUSE,matDiffuse,0);
gl.glLightfv(GL10.GL_LIGHT0,GL10.GL_AMBIENT,lightAmbient,0);
gl.glLightfv(GL10.GL_LIGHT0,GL10.GL_DIFFUSE,lightDiffuse,0);
gl.glLightfv(GL10.GL_LIGHT0,GL10.GL_POSITION,lightPos,0);

//デプスバッファの指定
gl.glEnable(GL10.GL_DEPTH_TEST);
gl.glDepthFunc(GL10.GL_LEQUAL);

//テクスチャの有効化
gl.glEnable(GL10.GL_TEXTURE_2D);

//背景のクリア
gl.glClearColor(0.0f,0.0f,0.0f,0.0f);
gl.glClearDepthf(1.0f);

//頂点配列の指定
gl.glVertexPointer(3,GL10.GL_FLOAT,0,cubeBuff);
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);

//テクスチャ配列の指定
gl.glTexCoordPointer(2,GL10.GL_FLOAT,0,texBuff);
gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);

//片面スムーズシェーディングの指定
gl.glEnable(GL10.GL_CULL_FACE);
gl.glShadeModel(GL10.GL_SMOOTH);

//テクスチャの読み込み
tex=loadTexture(gl,bmp);
}

//描画
protected void drawFrame(GL10 gl) {
//背景塗り潰し
gl.glClear(GL10.GL_COLOR_BUFFER_BIT|GL10.GL_DEPTH_BUFFER_BIT);

//モデルビュー行列の指定
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glLoadIdentity();
GLU.gluLookAt(gl,0,0,3,0,0,0,0,1,0);

//回転の指定
gl.glRotatef(xrot,1,0,0);
gl.glRotatef(yrot,0,1,0);

//前面と背面のプリミティブの描画
gl.glColor4f(1.0f,1,1,1.0f);
gl.glNormal3f(0,0,1);
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP,0,4);
gl.glNormal3f(0,0,-1);
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP,4,4);

//左面と右面のプリミティブの描画
gl.glColor4f(1,1.0f,1,1.0f);
gl.glNormal3f(-1,0,0);
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP,8,4);
gl.glNormal3f(1,0,0);
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP,12,4);

//上面と下面のプリミティブの描画
gl.glColor4f(1,1,1.0f,1.0f);
gl.glNormal3f(0,1,0);
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP,16,4);
gl.glNormal3f(0,-1,0);
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP,20,4);

//回転
xrot+=1.0f;
yrot+=0.5f;
}
}

GL10メソッド 説明
void glNormal3f(float nx, float ny, float nz) 法線の指定
void glNormal3x(int nx, int ny, int nz)


チュートリアル9
ブレンディングを利用して立方体のプリミティブを表示するOpenGLプログラムを作成する。



GLTutorialNine.java
package edu.union;
import java.nio.*;
import javax.microedition.khronos.opengles.*;
import android.content.*;
import android.graphics.*;
import android.opengl.*;

//チュートリアル9
public class GLTutorialNine extends GLTutorialBase {
float[] lightAmbient=new float[]{0.3f,0.3f,0.3f,1.0f};//光源アンビエント
float[] lightDiffuse=new float[]{0.6f,0.6f,0.6f,1.0f};//光源ディフューズ
float[] lightPos =new float[]{0,0,3,1}; //光源位置

float[] matAmbient=new float[]{1f,1f,1f,1.0f};//マテリアルアンビエント
float[] matDiffuse=new float[]{1f,1f,1f,1.0f};//マテリアルディフューズ

int tex;//テクスチャ
Bitmap bmp;//ビットマップ

float box[]=new float[] {//頂点座標
//前面
-0.5f, -0.5f, 0.5f,
0.5f, -0.5f, 0.5f,
-0.5f, 0.5f, 0.5f,
0.5f, 0.5f, 0.5f,
//背面
-0.5f, -0.5f, -0.5f,
-0.5f, 0.5f, -0.5f,
0.5f, -0.5f, -0.5f,
0.5f, 0.5f, -0.5f,
//左面
-0.5f, -0.5f, 0.5f,
-0.5f, 0.5f, 0.5f,
-0.5f, -0.5f, -0.5f,
-0.5f, 0.5f, -0.5f,
//右面
0.5f, -0.5f, -0.5f,
0.5f, 0.5f, -0.5f,
0.5f, -0.5f, 0.5f,
0.5f, 0.5f, 0.5f,
//上面
-0.5f, 0.5f, 0.5f,
0.5f, 0.5f, 0.5f,
-0.5f, 0.5f, -0.5f,
0.5f, 0.5f, -0.5f,
//下面
-0.5f, -0.5f, 0.5f,
-0.5f, -0.5f, -0.5f,
0.5f, -0.5f, 0.5f,
0.5f, -0.5f, -0.5f,
};

float texCoords[]=new float[] {//頂点テクスチャ
//前面
0.0f, 0.0f,
1.0f, 0.0f,
0.0f, 1.0f,
1.0f, 1.0f,
//背面
1.0f, 0.0f,
1.0f, 1.0f,
0.0f, 0.0f,
0.0f, 1.0f,
//左面
1.0f, 0.0f,
1.0f, 1.0f,
0.0f, 0.0f,
0.0f, 1.0f,
//右面
1.0f, 0.0f,
1.0f, 1.0f,
0.0f, 0.0f,
0.0f, 1.0f,
//上面
0.0f, 0.0f,
1.0f, 0.0f,
0.0f, 1.0f,
1.0f, 1.0f,
//下面
1.0f, 0.0f,
1.0f, 1.0f,
0.0f, 0.0f,
0.0f, 1.0f
};

FloatBuffer cubeBuff;//頂点座標バッファ
FloatBuffer texBuff; //頂点テクスチャバッファ

float xrot=0.0f;//X軸回転量
float yrot=0.0f;//Y軸回転量

//コンストラクタ
public GLTutorialNine(Context c) {
super(c, 20);

//ビットマップの読み込み
bmp=BitmapFactory.decodeResource(c.getResources(),R.drawable.icon);

//バッファの生成
cubeBuff=makeFloatBuffer(box);
texBuff =makeFloatBuffer(texCoords);

//フォーカスの指定
setFocusable(true);
}

//初期化
protected void init(GL10 gl) {
//光源の指定
gl.glEnable(GL10.GL_LIGHTING);
gl.glEnable(GL10.GL_LIGHT0);
gl.glMaterialfv(GL10.GL_FRONT_AND_BACK,GL10.GL_AMBIENT,matAmbient,0);
gl.glMaterialfv(GL10.GL_FRONT_AND_BACK,GL10.GL_DIFFUSE,matDiffuse,0);
gl.glLightfv(GL10.GL_LIGHT0,GL10.GL_AMBIENT,lightAmbient,0);
gl.glLightfv(GL10.GL_LIGHT0,GL10.GL_DIFFUSE,lightDiffuse,0);
gl.glLightfv(GL10.GL_LIGHT0,GL10.GL_POSITION,lightPos,0);

//アルファブレンディングの指定
gl.glEnable(GL10.GL_BLEND);
gl.glDisable(GL10.GL_DEPTH_TEST);
gl.glBlendFunc(GL10.GL_SRC_ALPHA,GL10.GL_ONE);

//テクスチャの指定
gl.glEnable(GL10.GL_TEXTURE_2D);

//背景の初期化
gl.glClearColor(0.0f,0.0f,0.0f,0.0f);
gl.glClearDepthf(1.0f);

//頂点配列の指定
gl.glVertexPointer(3,GL10.GL_FLOAT,0,cubeBuff);
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);

//テクスチャ配列の指定
gl.glTexCoordPointer(2,GL10.GL_FLOAT,0,texBuff);
gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);

//シェーディングの指定
gl.glShadeModel(GL10.GL_SMOOTH);

//テクスチャの読み込み
tex=loadTexture(gl,bmp);
}

//描画
protected void drawFrame(GL10 gl) {
//背景塗り潰し
gl.glClear(GL10.GL_COLOR_BUFFER_BIT|GL10.GL_DEPTH_BUFFER_BIT);

//モデルビューの指定
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glLoadIdentity();
GLU.gluLookAt(gl,0,0,3,0,0,0,0,1,0);

//回転の指定
gl.glRotatef(xrot,1,0,0);
gl.glRotatef(yrot,0,1,0);

//前面と背面のプリミティブの描画
gl.glColor4f(1.0f,1,1,1.0f);
gl.glNormal3f(0,0,1);
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP,0,4);
gl.glNormal3f(0,0,-1);
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP,4,4);

//左面と右面のプリミティブの描画
gl.glColor4f(1,1.0f,1,1.0f);
gl.glNormal3f(-1,0,0);
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP,8,4);
gl.glNormal3f(1,0,0);
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP,12,4);

//上面と下面のプリミティブの描画
gl.glColor4f(1,1,1.0f,1.0f);
gl.glNormal3f(0,1,0);
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP,16,4);
gl.glNormal3f(0,-1,0);
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP,20,4);

//回転
xrot+=1.0f;
yrot+=0.5f;
}
}

GL10メソッド 説明
void glBlendFunc(int sfactor, int dfactor) ピクセル算術の指定
sfactorに赤緑青αソースブレンディング要素がどのように計算されるか、
dfactorに赤緑青αデスティネーションブレンディング要素がどのように計算されるかを指定


pname定数 説明
GL_ZERO ( 0, 0, 0, 0 )
GL_ONE ( 1, 1, 1, 1 )
GL_SRC_COLOR ( Rs / kR, Gs / kG, Bs / kB, As / kA )
GL_ONE_MINUS_SRC_COLOR ( 1, 1, 1, 1 ) - ( Rs / kR, Gs / kG, Bs / kB, As / kA )
GL_DST_COLOR ( Rd / kR, Gd / kG, Bd / kB, Ad / kA )
GL_ONE_MINUS_DST_COLOR ( 1, 1, 1, 1 ) - ( Rd / kR, Gd / kG, Bd / kB, Ad / kA )
GL_SRC_ALPHA ( As / kA, As / kA, As / kA, As / kA )
GL_ONE_MINUS_SRC_ALPHA ( 1, 1, 1, 1 ) - ( As / kA, As / kA, As / kA, As / kA )
GL_DST_ALPHA ( Ad / kA, Ad / kA, Ad / kA, Ad / kA )
GL_ONE_MINUS_DST_ALPHA ( 1, 1, 1, 1 ) - ( Ad / kA, Ad / kA, Ad / kA, Ad / kA )
GL_SRC_ALPHA_SATURATE ( i, i, i, 1 )


チュートリアル10
フォグを利用して立方体のプリミティブを表示するOpenGLプログラムを作成する。



GLTutorialTen.java
package edu.union;
import java.nio.*;
import javax.microedition.khronos.opengles.*;
import android.content.*;
import android.graphics.*;
import android.opengl.*;
import android.view.*;

//チュートリアル10
public class GLTutorialTen extends GLTutorialBase {
float[] lightAmbient=new float[]{0.3f,0.3f,0.3f,1.0f};//光源アンビエント
float[] lightDiffuse=new float[]{1f,1f,1f,1.0f}; //光源ディフューズ
float[] lightPos =new float[]{0,0,3,1}; //光源位置

float[] matAmbient=new float[]{0.6f,0.6f,0.6f,1.0f};//マテリアルアンビエント
float[] matDiffuse=new float[]{0.6f,0.6f,0.6f,1.0f};//マテリアルディフューズ

int tex;//テクスチャ
Bitmap bmp;//ビットマップ

boolean fog;//フォグフラグ
float[] fogColor={0.5f,0.5f,0.5f,1.0f};//フォグ色

float box[]=new float[] {//頂点座標
//前面
-0.5f, -0.5f, 0.5f,
0.5f, -0.5f, 0.5f,
-0.5f, 0.5f, 0.5f,
0.5f, 0.5f, 0.5f,
//背面
-0.5f, -0.5f, -0.5f,
-0.5f, 0.5f, -0.5f,
0.5f, -0.5f, -0.5f,
0.5f, 0.5f, -0.5f,
//左面
-0.5f, -0.5f, 0.5f,
-0.5f, 0.5f, 0.5f,
-0.5f, -0.5f, -0.5f,
-0.5f, 0.5f, -0.5f,
//右面
0.5f, -0.5f, -0.5f,
0.5f, 0.5f, -0.5f,
0.5f, -0.5f, 0.5f,
0.5f, 0.5f, 0.5f,
//上面
-0.5f, 0.5f, 0.5f,
0.5f, 0.5f, 0.5f,
-0.5f, 0.5f, -0.5f,
0.5f, 0.5f, -0.5f,
//下面
-0.5f, -0.5f, 0.5f,
-0.5f, -0.5f, -0.5f,
0.5f, -0.5f, 0.5f,
0.5f, -0.5f, -0.5f,
};

float texCoords[]=new float[] {//頂点テクスチャ
//前面
0.0f, 0.0f,
1.0f, 0.0f,
0.0f, 1.0f,
1.0f, 1.0f,
//背面
1.0f, 0.0f,
1.0f, 1.0f,
0.0f, 0.0f,
0.0f, 1.0f,
//左面
1.0f, 0.0f,
1.0f, 1.0f,
0.0f, 0.0f,
0.0f, 1.0f,
//右面
1.0f, 0.0f,
1.0f, 1.0f,
0.0f, 0.0f,
0.0f, 1.0f,
//上面
0.0f, 0.0f,
1.0f, 0.0f,
0.0f, 1.0f,
1.0f, 1.0f,
//下面
1.0f, 0.0f,
1.0f, 1.0f,
0.0f, 0.0f,
0.0f, 1.0f
};

FloatBuffer cubeBuff;//頂点座標バッファ
FloatBuffer texBuff; //頂点テクスチャバッファ

float xrot=0.0f;//X軸回転量
float yrot=0.0f;//Y軸回転量

//コンストラクタ
public GLTutorialTen(Context c) {
super(c, 20);

//ビットマップの読み込み
bmp=BitmapFactory.decodeResource(c.getResources(),R.drawable.icon);

//バッファの生成
cubeBuff=makeFloatBuffer(box);
texBuff =makeFloatBuffer(texCoords);

//フォーカスの指定
setFocusable(true);
}

//初期化
protected void init(GL10 gl) {
//光源の指定
gl.glEnable(GL10.GL_LIGHTING);
gl.glEnable(GL10.GL_LIGHT0);
gl.glLightfv(GL10.GL_LIGHT0,GL10.GL_AMBIENT,lightAmbient,0);
gl.glLightfv(GL10.GL_LIGHT0,GL10.GL_DIFFUSE,lightDiffuse,0);
gl.glLightfv(GL10.GL_LIGHT0,GL10.GL_POSITION,lightPos,0);

//デプスバッファの指定
gl.glEnable(GL10.GL_DEPTH_TEST);
gl.glClearDepthf(1.0f);
gl.glEnable(GL10.GL_TEXTURE_2D);
gl.glEnable(GL10.GL_CULL_FACE);

//背景のクリア
gl.glClearColor(0.0f,0.0f,0.0f,0.0f);
gl.glClearDepthf(1.0f);

//頂点配列の指定
gl.glVertexPointer(3,GL10.GL_FLOAT,0,cubeBuff);
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);

//テクスチャ配列の指定
gl.glTexCoordPointer(2,GL10.GL_FLOAT,0,texBuff);
gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);

//シェーディングの指定
gl.glShadeModel(GL10.GL_SMOOTH);

//テクスチャの読み込み
tex=loadTexture(gl, bmp);

//フォグの指定
gl.glFogf(GL10.GL_FOG_MODE,GL10.GL_EXP);;
gl.glFogfv(GL10.GL_FOG_COLOR,fogColor,0);
gl.glFogf(GL10.GL_FOG_DENSITY,0.75f);
gl.glHint(GL10.GL_FOG_HINT,GL10.GL_DONT_CARE);
gl.glFogf(GL10.GL_FOG_START,1.0f);
gl.glFogf(GL10.GL_FOG_END,5.0f);
gl.glEnable(GL10.GL_FOG);
}

//描画
protected void drawFrame(GL10 gl) {
//フォグの有効・無効
if (fog) {
gl.glEnable(GL10.GL_FOG);
} else {
gl.glDisable(GL10.GL_FOG);
}

//背景塗り潰し
gl.glClear(GL10.GL_COLOR_BUFFER_BIT|GL10.GL_DEPTH_BUFFER_BIT);

//モデルビューの指定
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glLoadIdentity();
GLU.gluLookAt(gl,0,0,3,0,0,0,0,1,0);
gl.glPushMatrix();

//回転の指定
gl.glRotatef(xrot,1,0,0);
gl.glRotatef(yrot,0,1,0);

//テクスチャの指定
gl.glBindTexture(GL10.GL_TEXTURE_2D,tex);
gl.glEnable(GL10.GL_TEXTURE_2D);
gl.glMaterialfv(GL10.GL_FRONT_AND_BACK,GL10.GL_AMBIENT,matAmbient,0);
gl.glMaterialfv(GL10.GL_FRONT_AND_BACK,GL10.GL_DIFFUSE,matDiffuse,0);

//頂点配列の指定
gl.glVertexPointer(3,GL10.GL_FLOAT,0,cubeBuff);
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);

//テクスチャ配列の指定
gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
gl.glTexCoordPointer(2,GL10.GL_FLOAT,0,texBuff);

//前面と背面のプリミティブの描画
gl.glNormal3f(0,0,1);
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP,0,4);
gl.glNormal3f(0,0,-1);
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP,4,4);

//左面と右面のプリミティブの描画
gl.glNormal3f(-1,0,0);
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP,8,4);
gl.glNormal3f(1,0,0);
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP,12,4);

//上面と下面のプリミティブの描画
gl.glNormal3f(0,1,0);
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP,16,4);
gl.glNormal3f(0,-1,0);
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP,20,4);

//回転
xrot+=1f;
yrot+=0.5f;
}

//キーダウンイベントの処理
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (event.getKeyCode()==KeyEvent.KEYCODE_DPAD_LEFT) {
fog=true;
} else if (event.getKeyCode()==KeyEvent.KEYCODE_DPAD_RIGHT) {
fog=false;
}
return super.onKeyDown(keyCode,event);
}
}

GL10メソッド 説明
void glBindTexture(int target, int texture) 指定したテクスチャを有効にする
targetにテクスチャの次元、textureにテクスチャIDを指定

target定数 説明
GL_TEXTURE_1D テクスチャ1D
GL_TEXTURE_2D テクスチャ2D


void glFogf(int pname, float param) フォグの指定
pnameにフォグパラメータ種別、paramにパラメータを指定


pname定数 説明
GL_FOG_MODE フォグの混合要素の計算に使用される等式を指定
パラメータにはGL_LINEAR、GL_EXP、GL_EXP2のいずれかを指定
初期値GL_EXP
GL_FOG_DENSITY フォグの指数方程式に使用するフォグ密度を指定
パラメータには単独の整数、または浮動小数点値を指定
初期値1
GL_FOG_START GL_LINEAR で使用する近景位置を指定
パラメータには単独の整数、または浮動小数点値を指定
初期値0
GL_FOG_END GL_LINEARで使用する遠景位置を指定
パラメータには単独の整数、または浮動小数点値を指定
初期値1
GL_FOG_INDEX フォグのカラー指標を指定
パラメータには単独の整数、または浮動小数点値を指定
初期値0
GL_FOG_COLOR フォグの色を指定
パラメータは4つの整数、または浮動小数点値へのポインタを指定
初期値(0,0,0,0)
void glFogfv(int pname, FloatBuffer params)
void glFogfv(int pname, float[] params, int offset)
void glFogx(int pname, int param)
void glFogxv(int pname, int[] params, int offset)
void glFogxv(int pname, IntBuffer params)


チュートリアル11
リフレクションを利用して立方体のプリミティブを表示するOpenGLプログラムを作成する。



GLTutorialEleven.java
package edu.union;
import java.nio.*;
import javax.microedition.khronos.opengles.*;
import android.content.*;
import android.opengl.*;
import android.view.*;

//チュートリアル11
public class GLTutorialEleven extends GLTutorialBase {
float[] lightAmbient=new float[]{0.2f,0.3f,0.6f,1.0f};//光源アンビエント
float[] lightDiffuse=new float[]{0.6f,0.6f,0.6f,1.0f};//光源ディフューズ
float[] lightPos =new float[]{0,0,3,1}; //光源位置

float[] matAmbient=new float[]{0.6f,0.6f,0.6f,1.0f};//マテリアルアンビエント
float[] matDiffuse=new float[]{0.6f,0.6f,0.6f,1.0f};//マテリアルディフューズ

float[] white=new float[]{1f,1f,1f,1.0f};//ホワイト
float[] trans=new float[]{1f,1f,1f,0.3f};//トランス

float box[]=new float[] {//立方体の頂点座標
//前面
-0.5f, -0.5f, 0.5f,
0.5f, -0.5f, 0.5f,
-0.5f, 0.5f, 0.5f,
0.5f, 0.5f, 0.5f,
//背面
-0.5f, -0.5f, -0.5f,
-0.5f, 0.5f, -0.5f,
0.5f, -0.5f, -0.5f,
0.5f, 0.5f, -0.5f,
//左面
-0.5f, -0.5f, 0.5f,
-0.5f, 0.5f, 0.5f,
-0.5f, -0.5f, -0.5f,
-0.5f, 0.5f, -0.5f,
//右面
0.5f, -0.5f, -0.5f,
0.5f, 0.5f, -0.5f,
0.5f, -0.5f, 0.5f,
0.5f, 0.5f, 0.5f,
//上面
-0.5f, 0.5f, 0.5f,
0.5f, 0.5f, 0.5f,
-0.5f, 0.5f, -0.5f,
0.5f, 0.5f, -0.5f,
//下面
-0.5f, -0.5f, 0.5f,
-0.5f, -0.5f, -0.5f,
0.5f, -0.5f, 0.5f,
0.5f, -0.5f, -0.5f,
};

float[] floorVertices=new float[] {//床の頂点座標
-3.0f, 0.0f, 3.0f,
3.0f, 0.0f, 3.0f,
-3.0f, 0.0f,-3.0f,
3.0f, 0.0f,-3.0f
};

FloatBuffer cubeBuff; //立方体の頂点座標バッファ
FloatBuffer floorBuff;//床の頂点座標バッファ

float xrot=0.0f;//X軸回転量
float yrot=0.0f;//Y軸回転量

float y=1.5f;//Y座標

//コンストラクタ
public GLTutorialEleven(Context c) {
super(c, 20);

//バッファの生成
cubeBuff =makeFloatBuffer(box);
floorBuff=makeFloatBuffer(floorVertices);

//フォーカスの指定
setFocusable(true);
}

//初期化
protected void init(GL10 gl) {
//光源の指定
gl.glEnable(GL10.GL_LIGHTING);
gl.glEnable(GL10.GL_LIGHT0);
gl.glMaterialfv(GL10.GL_FRONT_AND_BACK,GL10.GL_AMBIENT,matAmbient,0);
gl.glMaterialfv(GL10.GL_FRONT_AND_BACK,GL10.GL_DIFFUSE,matDiffuse,0);
gl.glLightfv(GL10.GL_LIGHT0,GL10.GL_AMBIENT,lightAmbient,0);
gl.glLightfv(GL10.GL_LIGHT0,GL10.GL_DIFFUSE,lightDiffuse,0);
gl.glLightfv(GL10.GL_LIGHT0,GL10.GL_POSITION,lightPos,0);

//デプスバッファの指定
gl.glEnable(GL10.GL_DEPTH_TEST);
gl.glDepthFunc(GL10.GL_LEQUAL);

//頂点配列の指定
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);

//背景のクリア
gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
gl.glClearDepthf(1.0f);

//片面スムーズシェーディングの指定
gl.glEnable(GL10.GL_CULL_FACE);
gl.glShadeModel(GL10.GL_SMOOTH);

//ステンシルのクリア
gl.glClearStencil(0);
}

//描画
protected void drawFrame(GL10 gl) {
//背景塗り潰し
gl.glClear(GL10.GL_COLOR_BUFFER_BIT|GL10.GL_DEPTH_BUFFER_BIT|GL10.GL_STENCIL_BUFFER_BIT);

//モデルビュー行列の指定
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glLoadIdentity();
GLU.gluLookAt(gl,0,3,7,0,0,0,0,1,0);

//ステンシルバッファの床を描画
gl.glDisable(GL10.GL_DEPTH_TEST);
gl.glColorMask(false,false,false,false);
gl.glDepthMask(false);

//ステンシルテストの有効化
gl.glEnable(GL10.GL_STENCIL_TEST);
gl.glStencilOp(GL10.GL_REPLACE,GL10.GL_REPLACE,GL10.GL_REPLACE);
gl.glStencilFunc(GL10.GL_ALWAYS,1,0xffffffff);

//立方体の頂点バッファの指定
gl.glVertexPointer(3,GL10.GL_FLOAT,0,floorBuff);
gl.glMaterialfv(GL10.GL_FRONT_AND_BACK,GL10.GL_DIFFUSE,white,0);
gl.glMaterialfv(GL10.GL_FRONT_AND_BACK,GL10.GL_AMBIENT,white,0);
gl.glNormal3f(0,1,0);
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP,0,4);

//リフレクションの描画
gl.glColorMask(true,true,true,true);
gl.glDepthMask(true);
gl.glEnable(GL10.GL_DEPTH_TEST);
gl.glStencilFunc(GL10.GL_EQUAL,1,0xffffffff);
gl.glStencilOp(GL10.GL_KEEP,GL10.GL_KEEP,GL10.GL_KEEP);

//立方体の描画
gl.glPushMatrix();
gl.glScalef(1.0f,-1f,1f);
gl.glLightfv(GL10.GL_LIGHT0,GL10.GL_POSITION,lightPos,0);
gl.glCullFace(GL10.GL_FRONT);
drawCube(gl);
gl.glCullFace(GL10.GL_BACK);
gl.glPopMatrix();
gl.glLightfv(GL10.GL_LIGHT0,GL10.GL_POSITION,lightPos,0);

//ステンシルテストの無効化
gl.glDisable(GL10.GL_STENCIL_TEST);

//ブレンドの有効化
gl.glEnable(GL10.GL_BLEND);
gl.glBlendFunc(GL10.GL_SRC_ALPHA,GL10.GL_ONE_MINUS_SRC_ALPHA);

//床の頂点バッファの指定
gl.glVertexPointer(3,GL10.GL_FLOAT,0,floorBuff);
gl.glMaterialfv(GL10.GL_FRONT_AND_BACK,GL10.GL_DIFFUSE,trans,0);
gl.glMaterialfv(GL10.GL_FRONT_AND_BACK,GL10.GL_AMBIENT,trans,0);
gl.glNormal3f(0,1,0);
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP,0,4);

//ブレンドの無効化
gl.glDisable(GL10.GL_BLEND);

//立方体の描画
drawCube(gl);

//回転
xrot+=1.0f;
yrot+=0.5f;
}

//キューブの描画
protected void drawCube(GL10 gl) {
gl.glPushMatrix();

//平行移動
gl.glTranslatef(0.0f,y,-1.0f);

//回転の指定
gl.glRotatef(xrot,1,0,0);
gl.glRotatef(yrot,0,1,0);

//頂点配列の指定
gl.glVertexPointer(3,GL10.GL_FLOAT,0,cubeBuff);

//プリミティブの描画
gl.glColor4f(1.0f,0,0,1.0f);
gl.glNormal3f(0,0,1);
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP,0,4);
gl.glNormal3f(0,0,-1);
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP,4,4);

//プリミティブの描画
gl.glColor4f(0,1.0f,0,1.0f);
gl.glNormal3f(-1,0,0);
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP,8,4);
gl.glNormal3f(1,0,0);
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP,12,4);

//プリミティブの描画
gl.glColor4f(0,0,1.0f,1.0f);
gl.glNormal3f(0,1,0);
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP,16,4);
gl.glNormal3f(0,-1,0);
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP,20,4);

gl.glPopMatrix();
}

//キーダウンイベントの処理
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (event.getKeyCode()==KeyEvent.KEYCODE_DPAD_UP) {
y+=0.1;
invalidate();
} else if (event.getKeyCode()==KeyEvent.KEYCODE_DPAD_DOWN) {
if (y>0.5)
y-=0.1;
invalidate();
}
return super.onKeyDown(keyCode,event);
}
}


GL10メソッド 説明
void glClearStencil(int s) ステンシルバッファがクリアされる時に使用されるインデックスを指定
void glStencilFunc(int func, int ref, int mask) ステンシルテストのための機能と基準値を指定
funcにテスト機能、refに基準値、maskにマスクを指定


func定数 説明
GL_NEVER 常に通過しない
GL_LESS 入って来る深度値が格納された深度値未満である時に通過
GL_EQUAL 入って来る深度値が格納された深度値と同等の時に通過
GL_LEQUAL 入って来る深度値が格納された深度値以下である時に通過
GL_GREATER 入って来る深度値が格納された深度値より大きな時に通過
GL_NOTEQUAL 入って来る深度値が格納された深度値と同等でない時に通過
GL_GEQUAL 入って来る深度値が、格納された深度値以上ある時に通過
GL_ALWAYS 常に通過
void glStencilMask(int mask) ステンシル平面の個々のビットの記述を可能にし無効にするためにビットマスクを指定
初期値1
void glStencilOp(int fail, int zfail, int zpass) ステンシルテストアクションを指定

failにステンシルテストが失敗する時の処理、zfailにステンシルテストが通過する時の処理、zpassに両方のステンシルテストと深度テスト通過、またはステンシル・テストが通過する時、 および深度バッファでないか、 深度テストが可能になるとは限らない時のステンシルアクションを指定。

fail定数 説明
GL_KEEP 現在値を維持
GL_ZERO 0にステンシルバッファ値を指定
GL_REPLACE glStencilFuncによって指定したとともにrefにステンシル・バッファー値を指定
GL_INCR 現在のステンシルバッファ値をインクリメント。最大の表現可能な符号なしの値へ留める
GL_DECR 現在のステンシルバッファ値をディクリメント。0までクランプ
GL_INVERT ビットワイズは現在のステンシルバッファ値を逆にする


−戻る−