語りたい3D系ユーザーの
ためのOpenGL考察 2

-マッピング-

片岡 宏仁


 これまで,シェーディングや光源,アンチエイリアシングについて簡単に説明しました.今回はシェーディングパラメータやマッピングについて解説していきたいと思います.最後に,Canopus社のSpectra5400シリーズを借用できたので,OpenGLサポートの現状についてレポートしてみたいと思います.
 前回は,原稿執筆時に,Pentium IIIのSIMD命令によるソフトウェアOpenGLアクセラレータが登場してしまい,原稿の内容に影響が出てしまいました.Spectra5400シリーズはTNT2を搭載しています.Canopus社からも独自に拡張したSIMD拡張命令が使用できるNT用ドライバが提供されています.TNT2自体は,Direct 3D向けの3Dアクセラレータと言われています.OpenGLの動作環境であるNT自体はWindows 98などと違い,Direct X3相当までの実装なので,Direct 3Dが速くなることが重要ですが,それよりもOpenGLでのパフォーマンス向上を期待してしまいます.高価なOpenGLカードに比べてどれくらい健闘できるのでしょうか….では,はじめましょう!

シェーディングパラメータ

 前回は,シェーディングの概念について解説してきましたが,シェーディングパラメータについても解説しておきましょう.OpenGLに限らず,シェーディングパラメータは,スペキュラ,ディフューズ,アンビエントという3つのパラメータが支配的です.初めて聞くと,「なんじゃこりゃ」という言葉ばかりですが,3Dのソフトウェアの開発,もしくは3Dソフトウェアを使ってコンテンツを作成しようとするならば,避けて通れないパラメータです.
 どのレンダラを使うかによって,これらパラメータの解釈は微妙に違ったりするのですが,大きく変わることはありません.シェーディングパラメータについて簡単に言ってしまうと,表面のザラザラ感とテリを調整するパラメータなのです.とかく,CGで表現される物体はプラスチックでできたような質感が多いものですが,このシェーディングパラメータをうまく調整することで,かなり緩和できるハズです.
 筆者もCG屋としてコンピュータをこき使っていた頃は,このシェーディングパラメータの達人として鳴らしてきたつもりです.その頃知りあった,今でも現役のCG屋として鳴らしている友人に,メジャーなレンダラであれば,どんな質感も一発で値を想像できるという強者がいます.レンダラを作る際には,このシェーディングパラメータを操作するための結構面倒な式があります.数学屋さんなどは「この式さえ知っていれば,どんな質感になるか想像できる!」と言ってくれます.しかし,無学な筆者などは,やっぱり式ではピンとこないのが現状です.
 結局,たび重なる経験とそれを支える感性が一番信頼できると思います.今回はこの式については紹介しません.どうしても知りたい場合には,関連書籍を探してみてください(その場合,グロー,フォン,ブリン,クックトーランスというキーワードも参照してみるといいでしょう).

● スペキュラ(鏡面反射光)
 まず,はじめにスペキュラもしくは鏡面反射光と言われているパラメータからはじめましょう.これは簡単にいうと,テリを表現するパラメータです.たとえば煮物の最後に「みりん」を入れるようなパラメータと言えばいいのでしょうか?もしくは,透明ニスを塗ったような質感と言えばいいのでしょうか?
 とにかく,このパラメータの値によって表面がツルツルしたように見えたり,ツヤのないものに見えたりします.大抵のCGでできた質感がプラスチックのようなのも,このスペキュラの値が高いためです.
 図1〜図3は実際にこれらの値がどのように効いてくるのかを表したものです.スペキュラの大きさをOpenGLではシャイネス(SHININESS)と呼んでいますが,シャイネスの値が大きい時には,白いハイライトが小さくなり,強く描画されます.これに対して,シャイネスの値が小さいときには,このハイライトが大きく広がり,弱く描画されます.スペキュラがほとんどない状態は石膏でできたような質感になります.

<図1>OpenGL スペキュラが
ない場合の質感
<図2>OpenGL スペキュラが
ある場合の質感
<図3>OpenGL スペキュラの
シャイネスが大きいときの質感
Ogl2-2.jpg (4164 バイト) Ogl2-3.jpg (4396 バイト) Ogl2-1.jpg (4887 バイト)

 悲しいかな,この自然界に存在するものでスペキュラが存在するものは,水や人間が作り出した人工物もしくは人工加工物ぐらいしかないのですが,大抵のレンダラにこのパラメータが搭載されているために,ほとんどのCGがテカテカした素材でできているように見えてしまうのです.
 ですから,CGで家のパースなどを作っても,壁がプラスチックでできているようにテカテカしてしまうのは,このパラメータの調整不足といえるのかもしれません.このパラメータが考え出された当初は,ピカッ!と光る質感に,先生やアーティストたちも驚喜乱舞したものですが,これだけ世の中がCGだらけになってくると,必要なときにだけ使うべきだと痛感してしまいます.このパラメータはどちらかというと物体固有の色ではなく,光源に依存しているパラメータといえます.

● ディフューズ(拡散反射光)
 次に,ディフューズを解説しましょう.これは,表面のザラつき加減を調整するパラメータです.どんなものでも,物体は固有の色を反射したり吸収したりしているのです.ディフューズは,このパラメータを調整しています.ザラザラといっても目に見えるほど大きなザラザラではなく,どちらかというと人間の肌やベルベットの布地を想像してもらうと理解しやすいと思います.
 例をあげると,ベルベットは,実際には普通の布地と同じ染料で染まっているのですが,それよりも色が沈んで見えます.これは,布地の表面に作られた細かい毛によって,布地表面内で乱反射もしくは拡散反射が起こっているためです.人間の肌も実は半透明で,表皮細胞の中のゼラチン質?をさまざまに光が乱反射して人間の肌の色を作り出しているのです.
 ですから,このディフーズパラメータの値を上げてザラザラ度を増すと,表面の色が沈みこんだような深い色に変化するのです.逆にディフーズパラメータの値を下げると軽いプラスチックのようなオモチャのような色に変化するのです.

● アンビエント(環境光)
 最後はアンビエントになります.これは環境光ともいわれています.大抵の方は気がついていないのですが,物体は光源からの直接光だけではなく,周囲の物体から反射してくる光を受けても発色しているのです.たとえば,月の写真を撮ると,月の陰の部分は地球からの光によって青白くなっています.しかし,宇宙で撮影されたスペースシャトルの陰の部分はほとんどが真っ黒です.
 これはどういうことかというと,周囲に光を反射する物体がないからです.地球の大気中であれば,同じ大きさの赤い玉と青い玉があって,青い玉に強い光が当たっているのであれば,隣の赤い玉に青い玉の反射光による影響がでてくるはずです.もちろん,床が白ければ,床の照り返しもあるでしょう.煙のような微粒子が部屋に立ち込めていれば,これらの微粒子による乱反射もあるでしょう.
 このように,物体を照らす光は周囲のパラメータに非常に敏感なのです.ですから,正確にアンビエントを計算しようとすると,周囲の物体表面の反射まで計算しなければならず,地獄の計算量が自動的に発生することになってしまうのです.そこで,CG屋さんはどうしたものかと考えたのでしょう.
 「そんな,直接光に比べたら非常に小さな値にCPUの計算時間の大半を使うのはもったいない!」と…「それじゃ,乱暴だけど一定の値でその物体が環境光に照らされていることにしてしまおう…これなら計算しなくてもすむし…」そんなわけで偉い先生たちの妥協の産物がこのアンビエントというパラメータを作り出したのです.純粋無垢な物理や数学の世界にみんな顔を見合わせて目を瞑ってしまったのです.
 「これでもいいよねぇ?」っと…
 もちろん,このことを黙って見ていられなかった先生たちもいて,すべての環境光をあらん限りのCPUパワーを使って計算するラジオシティーというレンダリング手法も考案されています.最近はパソコンのパワーが猛烈に上がってきたので,ラジオシティーはブームになろうとしているようです.
 アンビエントを使う際に,注意しなければならないことがあります.このアンビエントの値を1つのシーンで各物体にそれぞれ個別に与えすぎると不自然な画像になってしまうのです.あまり周囲が明るくないのに,ある物体だけが高いアンビエント値で発光していたらそれは不気味以外の何物でもないでしょう(図4).
 ダンジョンゲームなどで地下迷路の中に入ってしまったのに,メインキャラクタが地上と同じアンビエント値で描画されていたとすると,非常に不自然な画像になってしまいます.わざとそういった効果を狙うのでもないかぎりこのパラメータの調整には注意しなければならないでしょう.読者であれば,シェーディングパラメータの設定が変なゲームや作品を見つけて作り手側として楽しむという方法もありますが….

以下略


copyright 1999 片岡 宏仁