OpenGLのglNormal系は、currentの法線を設定する関数である。

これはかなり当り前の話。ところが、OpenGLはステートマシンなので、「currentの」というところが意外なところで効いてくる。
OpenGLではglNormal系の関数に初期値が設定してある。(0, 0, 1)、すなわちz軸の方向になっている。

つまり、glNormal系の関数を使っていない場合は、すべての面がz軸を向いているという設定が採用されるわけです。たとえば、glMaterial系の関数はこの法線情報を利用するので、明らかにおかしな描画になります。当たり前といえば当たり前なのですが、全部が黒く描画されるとかではないので意外と気づかなかったりするものです。

もっとたちが悪いことに、glutSolidTeapotやGLUQuadricなどを使うと、「currentの」法線が書き換えられて返ってくるので(0, 0, 1)ですらなくなってしまいます。

これは、VBOを使っていても同じ。normal有りのVBOを使わないときちんと描画されません。

で、なんでこんなことに躓いたかというと、COLLADAのデータを読み込んで描画した際にCOLLADAのデータに法線情報が入っていないのにmaterialが設定してあって、馬鹿正直にそのデータ通りレンダリングしたら、なんだかおかしい感じになっちゃったからですw

Comments

comments

Powered by Facebook Comments

Comments are closed.