▼Androidメモ▼
OpenGL ESのバージョン


OpenGL ESのバージョン
OpenGL ESのバージョン 説明 Androidのバージョン Androidのパッケージ
OpenGL ES 1.0
最初のバージョン Android 1.0(API Level 1) javax.microedition.khronos.opengles.GL10
javax.microedition.khronos.opengles.GL10Ext
OpenGL ES 1.1 VBOとスキンメッシュが利用可能に。 javax.microedition.khronos.opengles.GL11
javax.microedition.khronos.opengles.GL11Ext
OpenGL ES 2.0
プログラマブルシェーダ導入。
一部機能が廃止。
Android 2.2(API Level 8) android.opengl.GLES20
VBOが利用可能に。 Android 2.3(API Level 9)

OpenGL ES 1.1と2.0の比較

OpenGL ES 1.1 OpenGL ES 2.0
プログラマブルシェーダ 使用不可 GLSL ES 1.0
ジオメトリ glNormal/glVertexPointer/
glNormalPointer/glTexCordPointer
glVertexAttribPointer
マトリックス glMatrixMode/glLoadIdentity/glPushMatrix シェーダで実装
光源 glLight/glMaterial シェーダで実装
フォグ glFog シェーダで実装
アルファテスト glAlphaFunc シェーダで実装
ポイントスプライト glTexEnv シェーダで実装
ユーザークリップ glClipPlane シェーダで実装
ロジックオペレーション glLogicOp シェーダで実装
マルチサンプリング glEnable/glDisableで切り替え 常に有効
フレームバッファオブジェクト 拡張機能 サポート

OpenGL ESのデータ型
定数 Javaの型 値の範囲 容量

GL10.GL_UNSIGNED_BYTE byte 0〜255 1byte
GL10.GL_UNSIGNED_SHORT short 0〜65535 2byte
GL10.GL_SHORT short -32768〜32767 2byte
GL10.GL_FIXED int -2147483648〜2147483647 4byte
GL10.GL_FLOAT float ±14e-45〜±3.4028235e38
4byte
※GL10.GL_FIXEDはint型ですが整数ではなく固定少数を示す型。
float型の変数を65536倍してint型にキャストした値を利用(64436=1.0)。



ジオメトリパイプライン

ジオメトリパイプライン
頂点情報が画面に2D描画されるまでの処理のことを「ジオメトリ変換」、その流れのことを「ジオメトリパイプライン」と呼ぶ。
頂点情報が画面に2D描画されるまでの処理の流れは次の通り。

pipeline.png

※「モデル変換」と「ビュー変換」は操作対象となる変換行列が同じため、あわせて「モデルビュー変換」とも呼ぶ。

(1)ローカル座標
(0, 0, 0)を中心とするオブジェクト毎の3次元空間。
頂点情報はローカル座標で保持している。

(A)モデル変換(ワールド座標変換)
オブジェクトのローカル座標にアフィン変換を行うことで、オブジェクトをワールド座標に配置。

アフィン変換の関数
関数 説明
glTranslatef 平行移動
glRotatef
回転
glScalef
拡大縮小


(2)ワールド座標
複数のオブジェクト(カメラや光源も含む)が存在する3次元空間。

(B)ビュー変換(ビュー座標変換)
ワールド座標をビュー変換することで、「カメラの視点」「カメラの焦点」「カメラの上方向」を指定。
モデル変換の後にビュー変換を行う(つまりプログラムではビュー変換を最初に書く)。

ビュー変換で利用する関数
関数 説明
gluLookAt
「カメラの視点」「カメラの焦点」「カメラの上方向」を指定

(3)ビュー座標
カメラから見た3次元空間。

(C)射影変換(射影座標変換)
ビュー座標を射影変換することで、「視野角」「クリッピング」を指定。
カメラでいうところのレンズ選びにあたる。
射影変換には遠近感を出す「透視変換」と遠近感を無視した「正射影」がある。

射影変換で利用する関数
関数 説明
glMatrixMode
操作する変換行列の指定(射影行列はGL_PROJECTION)
glFloatv
変換行列の取得(射影行列はGL_PROJECTION_MATRIX)
glFrustum
円錐台の透視変換の設定
gluPerspective
遠近法の透視変換の設定
glOrtho
正射影の設定

(4)射影座標(正規化デバイス座標)
どの程度の範囲をどこまで見ることができるのかを反映した座標。
3D→2D変換は完了している。
座標は(-1 <= x <= 1), (-1 <= y <= 1), (-1 <= z <= 1)。

(D)ビューポート変換
射影座標を最終的に表示される2次元座標に変換。
カメラでいうところの印刷にあたる。

ビューポート変換で利用する関数
関数 説明
glViewport
ビューポートの設定

(5)ビューポート座標(スクリーン座標,ウィンドウ座標)
実際に画面に表示される2次元座標。
左上が(0, 0)で右下が(w, h)。

座標系

OpenGLとDirectXの座標系

OpenGL DirectX
3次元座標系 右手系座標
左手系座標
画像とウィンドウの座標系 左下原点
左上原点
回転方向 左回り
右回り
面の表と裏 左回りが表
右回りが表


フレームバッファ

フレームバッファの種類
バッファ 定数 説明
カラーバッファ GL_COLOR_BUFFER_BIT 「カラーバッファ」は色を保持するバッファ。
描画する時に常に利用。
デプスバッファ GL_DEPTH_BUFFER_BIT 「デプスバッファ」は奥行きを保持するバッファ。
ピクセル描画時にデプスバッファの奥行きと比較して描画するかしないかを判定。
奥行きのある3Dモデルを描画する時に利用。
ステンシルバッファ GL_STENCIL_BUFFER_BIT 「ステンシルバッファ」はステンシル値を保持するバッファ。
ピクセル描画時にステンシルバッファのステンシル値を比較して描画するかしないかを判定。
主な用途は次の通り。
用途 説明
合成 背景の画像に対してステンシルマスクを適用し、
マスクされた部分を別の画像に置き換える。
デカール ポリゴン表面に何らかの色を別に貼り付ける
合成を応用したテクニック。
ディゾルブとフェードとワイプ ディゾルブは動的な2つの画像の切り替え。
フェードはディゾルブの特殊形で、
白や黒の画像を用意して画面を切り替える。
ワイプもディゾルブの特殊形で、左から右へ、
または上から下へのように動的に画面を切り替える。
アウトラインとシルエット 描画するオブジェクトよりも少し小さいステンシルバッファを
用意してオブジェクトを描画することで、
外側だけアウトラインを引いたような描画が可能。
またステンシルバッファ部分だけを別の色で塗りつぶせば
シルエットとなる。




光源とマテリアル

光源
光源 説明 コード
環境光 「環境光」は光源や視点の位置に関係なく一様に照らす光。
視野を全体的に明るくするために利用。
gl10.glLightfv(GL10.GL_LIGHT0,GL10.GL_AMBIENT,//環境光の色
    new float[]{0.2f,0.2f,0.2f,1.0f},0);
拡散光 「拡散光」は光源と物体の角度で反射度合いが定まる光
物体に明るさで立体感を出すために利用。

光源からの距離に従って光を減衰させることができる。
減衰は2次関数(KC+KL*x+KQ*x~2)の値の逆数で決まる

gl10.glLightfv(GL10.GL_LIGHT0,GL10.GL_DIFFUSE,//拡散光の色
    new float[]{0.7f,0.7f,0.7f,1.0f},0);
gl10.glLightfv(GL10.GL_LIGHT0,GL10.GL_POSITION,//光源の位置
     new float[]{5.0f,5.0f,5.0f,1.0f},0);

gl10.glLightf(GL10.GL_LIGHT0,GL10.GL_CONSTANT_ATTENUATION,1);//一定減衰率
gl10.glLightf(GL10.GL_LIGHT0,GL10.GL_CONSTANT_ATTENUATION,0);
//線形減衰率
gl10.glLightf(GL10.GL_LIGHT0,GL10.GL_CONSTANT_ATTENUATION,0);//2次減衰率
平行光 「平行光」はXYZ方向無限遠の拡散光。
光源の位置のWに0を指定。
負荷が少ないため携帯端末で主に利用される。
gl10.glLightfv(GL10.GL_LIGHT0,GL10.GL_DIFFUSE,//拡散光の色
    new float[]{0.7f,0.7f,0.7f,1.0f},0);
gl10.glLightfv(GL10.GL_LIGHT0,GL10.GL_POSITION,//光源の位置
     new float[]{5.0f,5.0f,5.0f,0.0f},0);
スポットライト 「スポットライト」は方向と角度が制限されている拡散光。
スポットライトの方向
、スポットライト指数、カットオフ角度を指定。
スポットライト指数は値が高いほど光が光線の方向に集中。
カットオフ角度は光の出る範囲を角度(度)で指定。180で全方位。

gl10.glLightfv(GL10.GL_LIGHT0,GL10.GL_DIFFUSE,//拡散光の色
     new float[]{0.7f,0.7f,0.7f,1.0f},0);
gl10.glLightfv(GL10.GL_LIGHT0,GL10.GL_POSITION,//光源の位置
     new float[]{5.0f,5.0f,5.0f,1.0f},0);

gl10.glLightfv(GL10.GL_LIGHT0,GL10.GL_SPOT_DIRECTION,//スポットライト方向
    new float[]{-5.0f,-5.0f,-5.0f},0);
gl10.glLightf(GL10.GL_LIGHT0,GL10.GL_SPOT_EXPONENT,0);//スポットライト指数
gl10.glLightf(GL10.GL_LIGHT0,GL10.GL_SPOT_CUTOFF,45);//カットオフ角度
鏡面光 「鏡面光」は鏡や金属のように、特定の方向に強く反射する光
特定部分を明るくしてテカテカ感を出すために利用。
gl10.glLightfv(GL10.GL_LIGHT0,GL10.GL_SPECULAR,//鏡面光の色
    new float[]{0.7f,0.7f,0.7f,1.0f},0);
gl10.glLightfv(GL10.GL_LIGHT0,GL10.GL_POSITION,//光源の位置
 
  new float[]{5.0f,5.0f,5.0f,0.0f},0);

マテリアル
マテリアル 説明 コード
環境色 環境光と共に評価されるマテリアル色を指定。
gl10.glMaterialfv(GL10.GL_FRONT_AND_BACK,GL10.GL_AMBIENT,//環境色
    new float[]{1.0f,0.0f,0.0f,1.0f},0);
拡散色 拡散光と共に評価されるマテリアル色を指定
gl10.glMaterialfv(GL10.GL_FRONT_AND_BACK,GL10.GL_DIFFUSE,//拡散色
    new float[]{1.0f,0.0f,0.0f,1.0f},0);
鏡面色 鏡面光と共に評価されるマテリアル色を指定
鏡面指数でハイライトの強さを指定。
gl10.glMaterialfv(GL10.GL_FRONT_AND_BACK,GL10.GL_SPECULAR,//鏡面色
    new float[]{1.0f,0.0f,0.0f,1.0f},0);
gl10.glMaterialf(GL10.GL_FRONT_AND_BACK,GL10.GL_AMBIENT,60);//鏡面指数
放射色 放射色を指定。
gl10.glMaterialfv(GL10.GL_FRONT_AND_BACK,GL10.GL_EMISSION,//放射色
    new float[]{1.0f,0.0f,0.0f,1.0f},0);



デプステストとステンシルテストとアルファテストとカリング

各種条件に応じて描画するかしないかを判定し、 描画量を減らして最適化。

デプステスト
奥行きに応じて描画するかしないかを判定する設定。
デプステスト コード
デプステストを有効。
3D描画時に利用。
デプスバッファが浅いものが上に表示される。
gl10.glEnable(GL10.GL_DEPTH_TEST);
デプステストを無効。
2D描画時に利用。
後から描画したものが上に表示される。
gl10.glDisable(GL10.GL_DEPTH_TEST)

ステンシルテスト
ステンシル値に応じて描画するかしないかを判定する設定。
ステンシルテスト コード
ステンシルテストを有効
gl10.glEnable(GL10.GL_STENCIL_TEST);
ステンシルテストを無効 gl10.glDisable(GL10.GL_STENCIL_TEST)
以降の描画でステンシルバッファに1を書き込む gl10.glStencilFunc(GL10.GL_ALWAYS,1,~0);
gl10.glStencilOp(GL10.GL_KEEP,GL10.GL_REPLACE,GL10.GL_REPLACE);
gl10.glColorMask(false,false,false,false);
gl10.glDepthMask(false);
以降の描画でステンシル値が1の時だけ書き込む gl10.glStencilOp(GL10.GL_KEEP,GL10.GL_KEEP,GL10.GL_KEEP);
gl10.glStencilFunc(GL10.GL_EQUAL,1,~0);
gl10.glColorMask(true,true,true,true);
gl10.glDepthMask(true);

アルファテスト
ピクセルのアルファ値に応じて描画するかしないかを判定する設定。
アルファテスト コード
必ず描画しない gl10.glEnable(GL10.GL_ALPHA_TEST);
gl10.glAlphaFunc(GL10.GL_NEVER,1.0f);
必ず描画 gl10.glEnable(GL10.GL_ALPHA_TEST);
gl10.glAlphaFunc(GL10.GL_ALWAYS,1.0f);
ピクセルのアルファ値<refなら合格 gl10.glEnable(GL10.GL_ALPHA_TEST);
gl10.glAlphaFunc(GL10.GL_LESS,1.0f);
ピクセルのアルファ<=refなら合格 gl10.glEnable(GL10.GL_ALPHA_TEST);
gl10.glAlphaFunc(GL10.GL_LEQUAL,1.0f);
ピクセルのアルファ=refなら合格 gl10.glEnable(GL10.GL_ALPHA_TEST);
gl10.glAlphaFunc(GL10.GL_EQUAL,1.0f);
ピクセルのアルファ>=refなら合格 gl10.glEnable(GL10.GL_ALPHA_TEST);
gl10.glAlphaFunc(GL10.GL_GEQUAL,1.0f);
ピクセルのアルファ>refなら合格 gl10.glEnable(GL10.GL_ALPHA_TEST);
gl10.glAlphaFunc(GL10.GL_GREATER,1.0f);
ピクセルのアルファ!=refなら合格 gl10.glEnable(GL10.GL_ALPHA_TEST);
gl10.glAlphaFunc(GL10.GL_NOTEQUAL,1.0f);

カリング
ポリゴンの表裏に応じて描画するかしないかを判定する設定。
カリング コード
ポリゴンの両面を描画 gl10.glDisable(GL10.GL_CULL_FACE);
ポリゴンの表面のみ描画 gl10.glEnable(GL10.GL_CULL_FACE);
gl10.glCullFace(GL10.GL_BACK);
ポリゴンの裏面のみ描画 gl10.glEnable(GL10.GL_CULL_FACE);
gl10.glCullFace(GL10.GL_FRONT);



フラットシェーディングとスムーズシェーディング

フラットシェーディングとスムーズシェーディング
シェーディング
説明 コード
フラットシェーディング
通常のポリゴンシェーディング。 gl10.glShadeModel(GL10.GL_FLAT);
スムーズシェーディング
オブジェクトの表面が曲面の時、
ポリゴンとポリゴンの境界で滑らかに変化するように近似。
-
 - グローシェーディング 輝度の補完によるスムーズシェーディング。 gl10.glShadeModel(GL10.GL_SMOOTH);
 - フォンシェーディング 法線ベクトルの補完によるスムーズシェーディング。 フラグメントシェーダで法線で光源を計算




説明 コード
丸影
- -
簡易シャドウイング
影行列でモデルの影を地面に投影。
他のモデルに影を落とすことはできない。
-
シャドウボリューム - -
シャドウマップ - -

−戻る−