Androidアプリ開発 OpenGL テクスチャを貼りつけたときのハイライト [Android OpenGL]
前回、何に使うかわからない、と書いた(GL_SRC_ALPHA, GL_ONE)でのブレンド方法であるが、使い方を発見してしまった。
まず、OpenGL ESでは、テクスチャを貼ると、ハイライトが出ない(陰影は付くのではあるが)。スペキュラの値を調整してもテクスチャ画像の色より大きくなることがない。なので、白いハイライトは出ません。ということらしい。
以下のサイトに詳しく書いてある。
http://marina.sys.wakayama-u.ac.jp/~tokoi/?date=20080820
床井先生のところはすごく丁寧に書いてある。
無印のOpenGLならglLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL, GL_SEPARATE_SPECULAR_COLOR)といった設定をすれば、ハイライトが出るようになるらしいのだが、OpenGL ESには、残念ながらこの機能はない(もしかすると、サポートしている端末もあるかも知れない)。
しかし、そんなサポートされているかどうかわからない機能は危なくて使えない。
これに、変わる作戦として、テクスチャマッピングして一度描画してから、その後で同じポリゴンをテクスチャマッピングしないで描画する、といった方法がある。もちろん、単純に再描画したら上書きされてしまうので、2回目はアルファブレンドして描画する。
むむ、やってみたが、テクスチャマッピングしないと透けている部分も描画してしまうので、四角に絵を貼りつけたように見えてしまう。透明部分がない画像をテクスチャマッピングする分にはこの方法でOKかも知れない。
そこで、テクスチャマッピング有効で、ブレンド方法(GL_SRC_ALPHA, GL_ONE)で2回目の描画をしたらそれっぽく表示できた。
使い方間違ってる?
サイト内を検索
まず、OpenGL ESでは、テクスチャを貼ると、ハイライトが出ない(陰影は付くのではあるが)。スペキュラの値を調整してもテクスチャ画像の色より大きくなることがない。なので、白いハイライトは出ません。ということらしい。
以下のサイトに詳しく書いてある。
http://marina.sys.wakayama-u.ac.jp/~tokoi/?date=20080820
床井先生のところはすごく丁寧に書いてある。
無印のOpenGLならglLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL, GL_SEPARATE_SPECULAR_COLOR)といった設定をすれば、ハイライトが出るようになるらしいのだが、OpenGL ESには、残念ながらこの機能はない(もしかすると、サポートしている端末もあるかも知れない)。
しかし、そんなサポートされているかどうかわからない機能は危なくて使えない。
これに、変わる作戦として、テクスチャマッピングして一度描画してから、その後で同じポリゴンをテクスチャマッピングしないで描画する、といった方法がある。もちろん、単純に再描画したら上書きされてしまうので、2回目はアルファブレンドして描画する。
float half_white[] = {1.0f, 1.0f, 1.0f, 0.5f}; float transparent[] = {0.0f, 0.0f, 0.0f, 0.0f}; @Override public void onDrawFrame(GL10 gl) { gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); // ライティングをON gl.glEnable(GL10.GL_LIGHTING); // 光源を有効にして位置を設定 gl.glEnable(GL10.GL_LIGHT0); gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_POSITION, lightpos, 0); gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_AMBIENT, white, 0); gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_DIFFUSE, white, 0); gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_SPECULAR, yellow, 0); gl.glMatrixMode(GL10.GL_MODELVIEW); gl.glLoadIdentity(); // カメラ位置を設定 GLU.gluLookAt(gl, eyepos[0], eyepos[1], eyepos[2], 0, 0, 0, 0, 1, 0); gl.glEnable(GL10.GL_BLEND); gl.glEnable(GL10.GL_TEXTURE_2D); // スムースシェーディング gl.glShadeModel(GL10.GL_SMOOTH); // ソート Collections.sort(models, new ModelComparator()); for ( Model m : models ){ // 最初はマッピングして描画 gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_AMBIENT, gray, 0); gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_DIFFUSE, gray, 0); gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_SPECULAR, gray, 0); gl.glMaterialf(GL10.GL_FRONT_AND_BACK, GL10.GL_SHININESS, 80f); gl.glEnable(GL10.GL_TEXTURE_2D); gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA); m.draw(gl); if ( blendMode == 1 ){ // 2回目はハイライトのみ描画したい gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_AMBIENT, transparent, 0); gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_DIFFUSE, half_white, 0); gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_SPECULAR, half_white, 0); gl.glMaterialf(GL10.GL_FRONT_AND_BACK, GL10.GL_SHININESS, 80f); gl.glDisable(GL10.GL_TEXTURE_2D); gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE); m.draw(gl); } m.rotate(); } }
むむ、やってみたが、テクスチャマッピングしないと透けている部分も描画してしまうので、四角に絵を貼りつけたように見えてしまう。透明部分がない画像をテクスチャマッピングする分にはこの方法でOKかも知れない。
そこで、テクスチャマッピング有効で、ブレンド方法(GL_SRC_ALPHA, GL_ONE)で2回目の描画をしたらそれっぽく表示できた。
for ( Model m : models ){ gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_AMBIENT, gray, 0); gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_DIFFUSE, gray, 0); gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_SPECULAR, gray, 0); gl.glMaterialf(GL10.GL_FRONT_AND_BACK, GL10.GL_SHININESS, 80f); gl.glEnable(GL10.GL_TEXTURE_2D); gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA); m.draw(gl); if ( blendMode == 1 ){ gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_AMBIENT, transparent, 0); gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_DIFFUSE, half_white, 0); gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_SPECULAR, half_white, 0); gl.glMaterialf(GL10.GL_FRONT_AND_BACK, GL10.GL_SHININESS, 80f); // gl.glDisable(GL10.GL_TEXTURE_2D); gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE); m.draw(gl); } m.rotate(); } }
使い方間違ってる?
サイト内を検索
2012-04-13 16:35
nice!(0)
コメント(0)
Copyright Atsushi Asai Google+朝井淳
[データベースの気持ちがわかる]SQLはじめの一歩 (WEB+DB PRESS plus)
- 作者: 朝井 淳
- 出版社/メーカー: 技術評論社
- 発売日: 2015/03/03
- メディア: 単行本(ソフトカバー)
Access クエリ 徹底活用ガイド ~仕事の現場で即使える
- 作者: 朝井 淳
- 出版社/メーカー: 技術評論社
- 発売日: 2018/05/25
- メディア: 大型本
コメント 0