« 2015年03月 | メイン | 2015年07月 »

2015年06月 アーカイブ

2015年06月14日

[OpenGL] COLOR MATERIALの利点

OpenGLのcolor materialとは、material parameterの一部をcurrent colorに同期させるモードである。例えば、

glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE); /* (1) */
glEnable(GL_COLOR_MATERIAL);
glColor4f(1.0f, 0.0f, 0.0f, 1.0f);
(some drawing)
glDisable(GL_COLOR_MATERIAL);
とすると、
GLfloat red[4] = {1.0f, 0.0f, 0.0f, 1.0f};
glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, red);
(some drawing)
とするのと同じ効果が得られる。((1)のColorMaterialの設定は、この引数だとOpenGLのデフォルトと同じ設定なので、省略できる。OpenGL ESだと、そもそもこの関数は存在しない=ColorMaterialは常にFRONT_AND_BACK, AMBIENT_AND_DIFFUSEに働く)

これが何の役に立つのだろうか?と、ふと思った時にわからず、調べても見つからなかったので、自分なりにCOLOR_MATERIALのメリットを整理してみた。

1. 軽量("less expensive")である

Webを検索すると、いくつかのページに、color materialは"less expensive"と書かれてある。例えば、Avoiding 16 Common OpenGL Pitfallsに、

OpenGL's color material feature provides a less expensive way to change material parameters.
と書かれている。実は、筆者には"less expensive"の意味がよくわからないが、まさか
GLfloat red[4] = {1.0f, 0.0f, 0.0f, 1.0f};
glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, red);
より
glColor4f(1.0f, 0.0f, 0.0f, 1.0f);
の方がコードが短くて済む、という意味ではないと思う(前者が1行で書けないのはC言語だからである)ので、ハードウェアの処理負荷が少ないという意味だと思いたい。

2. LightingがOFFの場合と同じコードになる

LightingがOFFだとcurrent colorが描画に反映され、ONだとmaterial colorが描画に反映される。Material colorをglMaterialfv()で設定すると、例えば

glBegin(GL_TRIANGLES);
glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, red);
glVertex3f(0, 1, 0);
glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, green);
glVertex3f(-0.866f, -0.5f, 0);
glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, blue);
glVertex3f( 0.866f, -0.5f, 0);
glEnd();
このようになるのに対し、color materialを使うと
glBegin(GL_TRIANGLES);
glColor4f(1,0,0,1);
glVertex3f(0, 1, 0);
glColor4f(0,1,0,1);
glVertex3f(-0.866f, -0.5f, 0);
glColor4f(0,0,1,1);
glVertex3f( 0.866f, -0.5f, 0);
glEnd();
のように、lightingがOFFでもそのまま使えるコードにすることができる。

3. Color arrayの色をmaterialに反映できる

glBegin()〜glEnd()とするのでなく、頂点配列を用意してglDrawArrays()やElements()を使って描画する場合、頂点毎にmaterial colorを設定するには、color material+color arrayを用いるしかない。

一応、GLUTのサンプルコードを作ってみた。
color_material_test.c
display()のcase 1〜7(左クリックで出るメニューのTest1〜7)は、それぞれ、以下の内容である。

  1. Material colorをglMaterialfv()で設定する例(glBegin()〜glEnd()使用、case 3まで同様)
  2. Material colorをcolor materialで設定する例
  3. 同じコードがlighting OFFでも使えることを示す例
  4. Material colorをglMaterialfv()で設定する例(glDrawArrays()使用、以下同様)
    全ての頂点が同じ色になる。
  5. Material colorをcolor materialで設定する例(color array不使用)
    case 4と同じ表示になる。
  6. Material colorをcolor materialで設定する例(color array使用)
    Color materialを使用すれば、頂点毎にmaterialを変えられる。
  7. 同じコードがlighting OFFでも使えることを示す例(color array使用)
case 0(初期状態)は、Color materialを使用しないと、current colorもcolor arrayも反映されないことを示す例である。(灰色の四面体が表示される。)

実行例
case 1-3 case 4-5 case 6
左から、case 1-3、case 4-5、case 6の画面

続きを読む "[OpenGL] COLOR MATERIALの利点" »

2015年06月28日

4位

A級で4位だった。
Shoujou

4年前はB級で3位
3年前はA級で予選落ち
2年前はA級で1回戦敗退
1年前もA級で1回戦敗退、
だったので着実に進歩しているように見えるが、今年は運が良すぎた。

まず、予選が楽なグループだった。他のグループでは過去の上位入賞常連のI藤さんや、筆者が100回やっても勝てそうにないY田さんが予選敗退していたり、上位入賞常連のE島さんが黒星を付けられたり、過去出場したら半分以上優勝しているS尾さんが負けかけたりしていた中、うちのグループでは二歩で反則負けする人はいるわ、敵陣の四段目で成ったりして反則負けする人は居るわで、ポカミスだらけだった。
次に、決勝トーナメントのくじ引きで、1回戦シードのポジションを引き当てた。これだけで自己最高の2回戦進出である。
さらに、2回戦でどちらかに当たる2人の内の1人は予選で勝った相手であり、しかも1回戦ではその人が善戦していた(ポカミスで逆転負け)。決勝トーナメント14人中12番目の強さ、または全参加者中22番目の強さ(他の予選6グループの内5グループで強い人10人敗退)であれば、くじ運が良ければ4位になれてしまうのであるが、まさにそんな感じだった。

ついでに、運が良いことに、昨年までは3位までが賞状+盾だったのだが、今年は賞状だけは4位にも交付された。

続きを読む "4位" »

About 2015年06月

2015年06月にブログ「Weblog on mebius.tokaichiba.jp」に投稿されたすべてのエントリーです。過去のものから新しいものへ順番に並んでいます。

前のアーカイブは2015年03月です。

次のアーカイブは2015年07月です。

他にも多くのエントリーがあります。メインページアーカイブページも見てください。

Powered by
Movable Type 3.35