新連載

語りたい3D系ユーザーのための

OpenGL考察 1

片岡 宏仁


Opengl.jpg (20327 バイト)  GL?OpenGL?確かにWindowsには搭載されていますが,スクリーンセーバーぐらいにしか使われていないような気がしていませんか?それよりも,ゲームなどでおなじみのDirect3Dを使うほうが,キビキビ動いているような気もします.Direct3Dに比べると,OpenGLは緩慢に動く3D機構とも思えます.
 あの,GLスクリーンセーバーのWindowsマークがたなびいて,緩慢に動くさまは,こう感じさせてくれることでしょう(図A,図B,図C).「Direct3Dと似たような機能を提供しているのにスピードが遅いなぁ…」「なぜにいつまでもこんな機能をサポートしてるんだ?Direct3Dとどこが違うんだ?OSが重くなるだけで必要ないんじゃないの?」こう,思われる読者もおられることでしょう!?
 今回はそのあたりを少し解説してみようと思います.

グラフィックの混沌とした世界

 はるか昔のBASICやDOSの時代には,PCの画面に線でも書こうものなら大騒ぎだったのです.ところが,日本ではBASIC言語の標準として長い間君臨してきた,N88BASICが線を引いたり円を描いたりという命令を標準でサポートしていたため,これらの行為には無頓着でいられました.
 時代がDOSに移った時にも,日本ではNEC製PC-9800シリーズにμPD7220という,名チップが初代から搭載されていたため,C言語などを使うときでも,チップ任せで,これまた基本グラフィック描画アルゴリズムには無頓着だったのです.NEC製PC-9800シリーズはWindowsが普及するはるか以前からμPD7220,今でいうところの2Dアクセラレータを搭載していたのです.
 世界中がIBM PCのCGA,EGA,VGAというVRAM管理機構しか乗っていないノンインテリジェントなグラフィックカードに対応するため,基本グラフィック描画アルゴリズム習得に右往左往していた時代に,楽々とBIOSの機能を用いてグラフィック描画機能が使えていたのです.Windows2.0が出たころIBM PCに比べ,PC-9800シリーズがウィンドウを描画した際に,異常なまでに速かったのはそのためだったと思われます.
 そのようなわけで,日本では,ゲームのプログラマでもないかぎり,たいていのPCデベロッパが基本グラフィック描画アルゴリズムを探求しないで済んでしまったように思います.そして,そのままWindowsの世界に突入してしまったのです.本誌読者の中にも今やPCの画面に線や文字を描画するのはOSの仕事で,自分のアプリケーションが描画するものではない!という認識があるのではないでしょうか?「そんなことはない!」と言われるならば,この問題に答えてみましょう.

問題
 あなたのWindowsにはSetPixel();,GetPixel();APIしかありません.アプリケーションのクライアントエリアに円を書いてみてください.

 さあ,どうです?これにFPUが搭載されていないので,高速に実行できないsin();cos();という関数も使ってはいけません.こういう条件がついたらどうですか?…多分,たいていの人がお手上げなんじゃないでしょうか?…それはそれで幸せなことですが,たまには基本グラフィック描画アルゴリズムについて疑問に思うことも必要かなぁ…と思う次第です(オジサンになったのかなぁ…).

どうして,こんな古い話をするのかというと…

 どうしてこんな古い話をするのかというと,3Dの世界でも2Dと同じことが起ころうとしているのです.つまり,3Dの描画アルゴリズムを知らずにOSが用意してくれた機能のみを使って,開発していこうという風潮が蔓延しつつあります.
 そうはいっても,3Dの描画アルゴリズムを知らないということも,それはそれで幸せなことです.本来のソフトウェアがやろうとしていることは,3Dの描画アルゴリズムを自力で実装することではなく,3D表現を使って,ユーザーの理解を助けたり,楽しませることが重要なのですから.
 ただし,本誌読者のような高度なスキルをお持ちの方には,今後大幅にハードウェア化され,ブラックボックス化しようとしている3D表現に対し,重要となるポイントを認識しておいてほしいのです.このことを知っていれば,どのような処理を使ってプログラムを記述すれば速くなるのかが理解できます.また,実際にプログラムは書かなくても,3Dボードを選ぶ際の指針にもなるでしょう.では,はじめましょう.

Direct3DとOpenGL

 Direct3DとOpenGL,どちらも3D表示という観点では同じように見えます.なんとも似たような規格がWindowsには実装されているものです.たいていメインボリュームのビデオカードを買うと対応しているのがDirect3Dです.Direct3Dを含むDirectXは守備範囲が広く,3D表示だけではなく音やネットワーク,ジョイスティックなどがサポートされた大規模API群(正確にはコンポーネント群です.理解している人は突っ込まないように…)です.
 これはMicrosoft社がReality Lab.というゲーム用ソフトウェアを開発していた会社を買収した際に入手した技術です.しかし,見慣れてくればわかると思いますが,OpenGLに比べDirect3Dのほうが作り込みにもよりますが大雑把な表示であることに気が付くと思います.Direct3Dは基本的にゲーム用ですから厳密な表示精度は必要なく,それよりも,リアルタイム性に重きが置かれています.
 ですから,残念ながら,きわどい位置でポリゴンが交差した場合など,処理が正確でない場合があります.けれども,1秒間に30コマ近くもゲーム用の画像が生成されれば,それをマジマジと確認できる人はよほど動体視力の優れた人といえるでしょう.
 もう一方のOpenGLはこれに比べてリアルタイム性は低いものの,処理をはしょることなく正確に表示してくれます.
 OpenGLとはSilicon Graphics社(現在のSGI社)のワークステーションに搭載された,GL(Graphic Library:そのまま!)というC言語API群に含まれていたSGIワークステーションの機種依存部分を取り除いたバージョンのことです.
 Silicon Graphics社のワークステーションはCG業界ではリファレンスとなっています(コラム参照).その3D表示ハードウェアエンジンの優秀さは他社を寄せ付けないものがあります.このエンジンの簡易版は任天堂のNintendo64に搭載されたことでも有名です.
 もともとGLはUNIXワークステーションに搭載されていたため,CGはもちろんのこと,CAD(*1)やCAM,CAEといった高精度エンジニアリングアプリケーション向けに設計されています.ですから,その表示は常に正確さを要求されていたのです.たとえば,高精度エンジニアリングアプリケーションですから建設設計の現場などで利用されたりするわけです.100階建のビル設計用の表示が,ゲーム画面のようにラフだったら恐いと思いませんか?
 OpenGLのさらに面白いところは,Silicon Graphics社のワークステーションがR2000/R3000という30/40MIPS(*2)程度のCPU時代に設計されたため,ジオメトリ(図形情報のこと)をGLの管理するグラフィックカード(コントローラ)側で高速に処理させていたということです.このことは現在のPCで汎用CPUであるPentium IIIなどが猛烈な速さになったことでCPU側の処理で図形情報を扱うDirect3Dとは対局をなしています.
 当時はカード側にジオメトリを処理させるという切り分けがバランスの良い設計だったのです.そしてこのことこそが,SGI製ワークステーションの優位性でもあったわけです.ですからGLを実装しているコンピュータの表示回路には膨大なメモリとDSPのような専用計算機が搭載されています.このことからわかるように,OpenGLは高精度エンジニアリングアプリケーションが最優先なのです(そんなこと,耳にタコができるぐらい聞いてるよ!という読者も多いかと思いますが,おつきあいのほどを).

精度とスピードにはお金がかかる!

 精度とスピードにはお金がかかるというのは,普段から高速CPUに触手を伸ばしている読者であれば十分理解していだけると思います.標準でWindows NT/ 98/95に搭載されているOpenGLはソフトウェアエミュレータが実行しています.

以下略


copyright 1999 片岡宏仁