androidアプリ開発 OpenGL スペキュラ

Materialfvでオブジェクトに陰影のある色を付けることができた。しかし、まだ何かもの足りない。それは、「ハイライト」が出ないから。
スペキュラー
ハイライトっていうのは、光源からの光がオブジェクトで反射して見える白い部分のこと。テカテカな感じを表現するときに描かれる白い部分がハイライト。
ハイライトを出すには、スペキュラーを設定すればよい。スペキュラーも色属性のひとつなので、glMaterialfvで設定する。スペキュラーで設定した色が、ハイライトの色になる。
スペキュラーを設定したときは、一緒にSHININESSも設定した方がいい。どうでもいいが、この単語は読みにくい「シャイニネス」でいいのかなぁ... shineはシャインだからあっていると思うが。
シャイニネスの値は、0~128の間で決める。値が大きいほどハイライトの出る範囲が狭くなる。指定する値はひとつでかまわない。
では、実際にやってみよう。ここでもやはり赤と青の三角形に登場してもらうが、両方とも同じ表面を表示するように変更する。
スペキュラーの色はどちらも白、シャイニネスの値を青三角形が、20。赤三角形を100とした。

// レンダラークラス
class OpenGLRenderer implements Renderer {
float lightpos[] = {0.0f, 0.0f, 4.0f, 0.0f};
float red[] = {1.0f, 0.0f, 0.0f, 1.0f};
float green[] = {0.0f, 1.0f, 0.0f, 1.0f};
float blue[] = {0.0f, 0.0f, 1.0f, 1.0f};
float white[] = {1.0f, 1.0f, 1.0f, 1.0f};
@Override
public void onDrawFrame(GL10 gl) {
gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
// ライティングをON
gl.glEnable(GL10.GL_LIGHTING);
// 光源を有効にして位置を設定
gl.glEnable(GL10.GL_LIGHT0);
gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_POSITION, lightpos, 0);
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glLoadIdentity();
gl.glPushMatrix();		// マトリックス記憶
gl.glTranslatef(1f, 0, -3f);
gl.glRotatef(angle, 0, 1, 0);
gl.glEnable(GL10.GL_CULL_FACE);
gl.glCullFace(GL10.GL_BACK);
gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_AMBIENT, blue, 0);
gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_DIFFUSE, red, 0);
gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_SPECULAR, white, 0);
gl.glMaterialf(GL10.GL_FRONT_AND_BACK, GL10.GL_SHININESS, 100f);
model.draw(gl);
gl.glPopMatrix();		// マトリックスを戻す
// ふたつめの描画
gl.glPushMatrix();		// マトリックス記憶
gl.glTranslatef(-1f, 0, -3f);
gl.glRotatef(angle, 0, 1, 0);
gl.glCullFace(GL10.GL_BACK);
gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_AMBIENT, red, 0);
gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_DIFFUSE, blue, 0);
gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_SPECULAR, white, 0);
gl.glMaterialf(GL10.GL_FRONT_AND_BACK, GL10.GL_SHININESS, 20f);
model.draw(gl);
gl.glPopMatrix();		// マトリックスを戻す
angle += 0.5;			// 回転角度は最後に計算
}

スペキュラーは、glMaterialfvを使って、RGBAの値を設定する。パラメータ名は「GL_SPECULAR」。サンプルでは、フィールドwhiteの値を設定している。
シャイニネスの値は、ひとつだけ指定すればよいので、glMaterialfを使う。パラメータ名は「GL_SHININESS」。要素数が1の配列をglMaterialfvで設定してもかまわない。

ちょっとわかりにくいかも知れないが、こちら向きになったときにスペキュラーに指定した「白」で表示される。青の三角形の方がハイライトが出ている時間が長い。赤の方は、一瞬しか白くならない。

投稿者プロフィール

asai
asai
システムエンジニア
喋れる言語:日本語、C言語、SQL、JavaScript