SSブログ

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回目はアルファブレンドして描画する。

		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();
			}
		}




使い方間違ってる?




サイト内を検索

nice!(0)  コメント(0) 

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。



Copyright Atsushi Asai Google+朝井淳
[改訂第4版]SQLポケットリファレンス

[改訂第4版]SQLポケットリファレンス

  • 作者: 朝井 淳
  • 出版社/メーカー: 技術評論社
  • 発売日: 2017/02/18
  • メディア: 単行本(ソフトカバー)

イラストで理解 SQL はじめて入門

イラストで理解 SQL はじめて入門

  • 作者: 朝井 淳
  • 出版社/メーカー: 技術評論社
  • 発売日: 2019/05/16
  • メディア: 単行本(ソフトカバー)

[データベースの気持ちがわかる]SQLはじめの一歩 (WEB+DB PRESS plus)

[データベースの気持ちがわかる]SQLはじめの一歩 (WEB+DB PRESS plus)

  • 作者: 朝井 淳
  • 出版社/メーカー: 技術評論社
  • 発売日: 2015/03/03
  • メディア: 単行本(ソフトカバー)

Access クエリ 徹底活用ガイド ~仕事の現場で即使える

Access クエリ 徹底活用ガイド ~仕事の現場で即使える

  • 作者: 朝井 淳
  • 出版社/メーカー: 技術評論社
  • 発売日: 2018/05/25
  • メディア: 大型本

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。