OpenGL...

98/06/17(水)  − OpenGL... − OpenGL に欲しい機能など

 OpenGLは、実質3DCGの標準と言えるAPIである。 そして、その機能はCAD/CAM向きで 極めて高性能などと言われている。 確かに高性能ではある。 しかし、その仕様は、洗練されるまでAPIに追加されない。 OpenGLは、ARB(Architecture Review Board)と 呼ばれる委員会が新しい機能の提案や承認、新規リリースの承認、 適合性テストなどを行っている。 ARBメンバは複数の企業から公平に成り立っているため、 Direct3Dのように、Microsoft一社のみの意向で 簡単に仕様の変更/追加がなされることがないのである。 そのため、Direct3Dで実装されつつあるような新しい機能はもっていない。
 逆に、Direct3Dはどんどん新しいバージョンがリリースされている。 そして、特にゲームで利用価値が高くなるような、つまり、 「速度をあまり低下させずに 画質の向上を目指す」ことに関しては、 力の入れ方が違うのをひしひしと感じる。 とにかく使えそうな機能はどんどん追加するわけだ。 近い内にリリースされるDirectX6も、興味深い新機能がメジロ押しである。 もちろん、APIはその都度複雑になり、ごちゃごちゃになり、 わけわかめ状態になるという欠点があるのは事実なため、 手放しで喜べる訳でもないのだが。
 私は、今はOpenGLを使っている。 そうなると、 Direct3Dで使えるがOpenGLでは使えない機能 が気になってくる。 ここで、Direct3Dにあるかどうかは別として、私が極めて私的に OpenGLに欲しいと思っている機能についてまとめよう。

●各行列での頂点変換(ジオメトリ演算)の有効/無効スイッチ。
 つまりは、Direct3Dのような頂点形式の選択である。 OpenGLでは、全ての描画にはジオメトリ演算が付きまとう。 たとえ二次元の描画でもだ。 Direct3Dのように、ジオメトリ演算は自分のプログラムで行うといった ことはできないため、二次元だろうが三次元だろうが無関係に、 描画にはジオメトリ演算が付きまとうのである。 無用な演算は速度の低下を招く。
 そこで、 各行列の頂点への演算処理の適用の ON/OFF を選択する 機能が是非欲しいところなのである。

●屈折マッピングおよび法線環境マッピング
 OpenGLには、 動的にテクスチャ座標を生成してくれる機能がある。 この機能に、 屈折マッピングおよび法線環境マッピングが欲しいのである。
 屈折マッピングは前に少し書いたように、 基本的には環境マッピングと同じような考え方である。 ただ、 視線ベクトルを頂点表面で反射させるのではなく、屈折させる方法である。
 さて、法線環境マッピングとは、 ここで私が勝手に言っている言葉である。 だいたいは環境マッピングと同じ方法なのだが、 反射した視線ベクトルからテクスチャ座標を計算するのではなく、 法線ベクトルから直接テクスチャ座標を計算するのである。 なんでそんなのが必要かというと、 実はこのマッピング方法と環境マッピングがあれば、 シェーディング計算を一切行わずにライティングが可能なのである。 しかも 光源を何十個付けようがパフォーマンスは全く変わらない。 さらにDirectX6のように マルチテクスチャ機能まであると、パフォーマンスもかなり向上するだろう。
 まあ、しかしこれもあまり必要性は感じられないだろうから、実装されることは ないだろう...。 一回試してみたいという願望はあるのだが...。

●マルチテクスチャ
 そして、先程も述べたマルチテクスチャ機能である。 これは、ポリゴン一回の描画で複数のテクスチャを指定でき、 それらをアルファブレンディングなどで混合しながらラスタライズできる 機能である。 これができると、 テクスチャマッピング+環境マップハイライトを、 一回の描画処理で実行できてしまうのだ。 ハードウェアがサポートすればパフォーマンスは大幅に向上するし、 たとえAPIレベルの実装だけでも、かなり無駄は減ることになる。

●ハイライトの計算モデルをBlinnに
 OpenGLやDirect3Dで使われているスペキュラー要素によるハイライトの計算は、 「Phongのモデル」と呼ばれる アルゴリズムを用いている。 このPhongのモデル、実は強引である。また、それによる不具合も少しある。
  「Blinnのモデル」とは、Phongが 経験的に導入した式を少し変更し、 もっと物理的根拠から説明できる形にしたものである。 「Phongのモデル」では、 視線の方向と、光線が物体表面で正反射した方向 どれだけ近いか(つまりはその内積)で計算するモデルである。 ただ、これだけでは一般的な素材のハイライトには鈍すぎるため、 内積の値(マイナスは ゼロとみなし、0.0〜1.0の範囲)をべき乗し、 鋭さを出す 鋭いハイライトを表現するためには、通常数十から 百数十程度のべき乗が必要である。 このべき乗はあくまで経験則であり、 物理的な根拠は実はあまりない。
 「Blinnのモデル」は、 もっと物理的な根拠から説明のできるモデルである。 計算方法は、まず 視線ベクトルと光線ベクトルの二等分ベクトルを求める。 さらにこのベクトルの逆ベクトルと、 物体表面の法線ベクトルから 輝度(明るさ、つまり表面の色) を計算するのである。
 しっかし、 「視線ベクトルと光線ベクトルの二等分ベクトルの逆ベクトル」って 一体何のことだろうか? もっと分かりやすく書くと、光線が正反射した時、 ちょうどカメラに向かって反射するような 法線ベクトルのことである。 実はこれ、実に理にかなった計算方法なのだ。 何故こんな計算の仕方になるのか説明しよう。
 ハイライトがぼやける(ぼやけない場合は 光源が完全に映り込む)のは、 物体表面に細かいレベルの凹凸が存在するからだ。 この細かな凹凸が光線をそれぞれ鏡面反射させるため、 光源が完全に映り込むのではなく、ぼやけたハイライトになるのである。 通常の素材では、細かな凹凸(微平面)の向きはほとんどが 物体表面の法線に近い方向を向いている。 しかし量は少ないながらも、 物体表面の向きとはかなり違った向きの微平面も少しは存在する。 なんとなく、物体表面に近い向きの 微平面ほど、全体に占める量が多いことは理解できるだろう。
 Blinnのモデルを使う時、最も簡単な方法は、 微平面の法線ベクトル (二等分ベクトルの逆ベクトル)と物体表面の 法線ベクトル内積をとり、これをPhongのモデル同様 べき乗するものである。 これは言いかえるなら、 「微平面の量は、物体表面の向きから離れれば離れるほど、 その角度のcosのべき乗に比例して減衰する」 という考え方に基づいている。 鋭いハイライトをもつ表面は、角度が 開くと極端に減衰するため、 べき乗の値を大きく取るとよいことになる。 先程も述べたが、この減衰の仕方は もっとも単純な計算方法である。 さらに物理的に考えられた方法(例えば凹凸によって遮られる光の割合も 考慮した計算方法など)もあり、これらを使うとさらにリアルなハイライトを 表現することができる。 しかし、リアルタイムレンダリングで使うなら、ここまで考慮する必要はないだろう。 内積のべき乗だけで充分である。
 Blinnのモデルを利用すると、計算負荷はほぼ同じだが、ハイライトの減衰が Phongのモデルよりも少しリアルになる。 例えば、Phongではその計算上、 光線の反射ベクトルと視線ベクトルの角度差が 90度以上に開くと、ハイライトは 完全にゼロになってしまうが、 Blinnでは、光が裏から当たる角度まで滑らかに減衰する
 それからもうひとつ、Blinnのモデルだと 面白い表現ができる。 これも法線環境マッピング同様、個人的にちょっと試してみたい方法なのだが、 ......これはちょっと説明しにくいので、またの機会にしよう。 また考えがまとまったらその時点で紹介することにする。
 OpenGLでは 過去の実装が破棄されるようなことはまずあり得ないため、 Phongのモデルが無くなることは考えられない。 だが、せいぜいPhongのモデルとの選 択の余地ができてくれると、 非常にイカすんだよなあぁ。

 以上が、とりあえず個人的に 「OpenGLで欲しいなぁ」と思っている機能である。 考えてみると、あんまり実現の可能性はないなぁ。 でもまあ、マルチテクスチャや屈折マッピング などは、将来的には実装される可能性はあるだろう...。 あぁ、でも屈折マッピングは、屈折率とかのデータも必要になるし.... やっぱ無理かなぁ..(^^;;