MCL(105)

インデックスに戻る

前のMCLへ  次のMCLへ

▼ My Computer Life (105)

105. DirectX

 私はこのあたりの時期は、ゲーム会社で、職業プログラマとして働いていた。
 ゲームの開発とは、たいてい波がある。仕事があって、クソ忙しくて、泊まりになったりするような時期と、特に何も無くてやることがないような時期がある。で、その暇な時期は、暇つぶしというわけじゃないけど、何か自分で勉強だと思ってプログラムを作ったりしていた。
 私の場合、とりあえず3Dとかもやってみたかったので、WindowsとVisualC++という環境で、DirectXを使ったプログラムを自主制作していた。

 DirectXとは、マイクロソフトが主にゲームなどをWindows環境で実現するために作成した、一連のライブラリ・環境を指す。
 その前身は、Windows3.1時代に作られたWinGである。Windows3.1が普及しかけてきた頃、Windows対応ゲームの開発が問題となった。WindowsAPIを介してグラフィックを操作すると、どうしても重くなる。そこで、ゲームをやるならDOSで、という風潮が最初はあった。しかし、DOSはDOSで問題がある。表示能力には厳しい制限があるし、ビデオカードを利用するには、デバイスドライバが必要だった。WindowsであればOSで吸収している差異を、DOSアプリケーションでは独自に吸収せねばならなかったのだ。
 Windowsのシステムをショートカットし、なるべくハードウェアに直結した形で描画する事と、各種ビデオカードなどの差異を吸収する事の両立のために、Windows上で動くライブラリとしてのWinGを開発した。その結果、2D描画に関しては、Windows上でもそれなりの速度で行う事ができるようになった。

 やがてWindows95の時代が来て、WinGも32ビットアプリケーション化する必要があり、Windows Games SDKとしてその仕組みは引き継がれた。これは2D描画の基本的なシステムとしてのWinGの他に、ジョイスティック、キーボード、マウス、サウンドカードなど、その他のハードウェアの利用もサポートした、総合的なゲーム用SDKとなった。
 これらのコンポーネントは、2D描画部がDirectDraw、入力処理部がDirectInput、サウンド処理部がDirectSoundと、「Direct○○」の名前で呼ばれており、その総称はワイルドカードを使って「DirectX」と呼んでいた。そしてコンポーネント全体の世代として、まとめてDirectX1.0などと呼ばれていた。
 以降、バージョンが上がったり、コンポーネント全体の構成が変わったりするたび、DirectX2.0、DirectX3.0…と言う風に呼ばれるようになり、結局のところ、Windows Games SDKと呼ばれていたのは本当に最初だけで、すぐにDirectXという名前がシステムの通称となった。

 DirectXに先立つ、同様のSDKとしては、OpenGLというものが存在した。これを書いている現在でも、普通に存在する。
 OpenGLは、グラフィックワークステーションで有名なシリコングラフィックスのIRISで使われていたAPIをまとめた物で、その成り立ちから言って、CG作成など、グラフィック向けのSDKだった。
 それと比較すると、DirectXは、ジョイスティックの入出力なども含んだSDKで、成り立ちから言うとゲーム制作の補助が役割だった。だから、その時点ではOpenGLと異なる位置づけではあったのだけど、徐々にDirectXも、その存在意義が3Dグラフィックを表示する事になってきて、同じく進化したOpenGLとも立ち位置が衝突する事もあった。

 DirectXは、1995年に策定されて以来、ほぼ毎年のように更新されていった。2.0、3.0、5.0、6.0…となって、そして2002年にはDirectX9.0になった(ちなみに4.0はなぜか存在しない。IT業界あるあるだけど)。そのDirectX9の時代がかなり長かったな…と感じている。
 DirectX9は、特にそこで何かが大きく変わったという感じはしなかったが、それまでのDirectXで実装してきた技術を、色々まとめ上げたイメージだった。特に、その頃実装され始めたシェーダーは、DirectX9でかなり実用的になった。
 シェーダーって、なんか言葉のイメージから内容がつかめないと思う。3D描画エンジンが、普通の3D描画をする時に行う、頂点変換(ポリゴンの頂点位置を3D→2Dに座標変換する)や、最終的なピクセルの描画を行うところに対し、ユーザーオリジナルの処理をフックして挟み込む技術である。秒間何億とかいうオーダーで行われる頂点変換やピクセル描画に対して処理を追加するので、あんまり複雑な物は書けないし、当初は機械語で書くのが通例だった(さすがに機械語はCPU依存が激しいので、のちに独自のシェーダー言語が発達した)。これを利用すると、トゥーンシェード(漫画っぽい塗りにする)やファーシェード(ぬいぐるみのような毛の生えた感じのレンダリングをする)、ワンスキン(人間の皮膚のように、滑らかに曲がるポリゴンを実現する)など、従来の3D描画を1段超えた表現が可能になった。

 その後、2007年のWindowsVistaに合わせてDirectX10.0、2009年のWindows7に合わせてDirectX11.0が出た。DirectX9以降は、基本的にSDKの更新としては、3D性能の向上がほとんどである。他には、GPUをグラフィック以外の目的で使うための、GPGPU用途のライブラリが追加されたりしたくらいだ。
 それからずっと、DirectXは更新されず、11のマイナーチェンジに終始した。しかし、2015年に、Windows10専用のDirectX12がリリースされた。
 DirectX12は、だいぶハードウェア寄りのSDKとなった。11までは、かなり高級なライブラリだった。つまり1命令(関数)だけで、かなりの処理をしてくれる。私のような、趣味でいじっているくらいの人にはちょうど良かった。更に、追加ライブラリの、DirectX3D Extention(D3DX)も用意されており、そちらは更に多数の関数が、色んなサポートをしてくれるので、次回説明するが、大変気軽にプログラムが作れた。
 しかし12になって、そのへんの高級な機能はなくなり、よりハードウェア、すなわちグラボに密着したSDKとなった。その結果、PCゲームメーカーのような、ガチ勢にとってはDirectX11までよりはずっとパワーを引き出せるようになったが、私のようなサンデープログラマにとって気軽に扱える物ではなくなった。ただ、Windows10では普通にDirectX11系列も動くので、もしかしたらサンデープログラマはそちらを使用するのが良いのかも知れない。
 DirectX12がこのような進化をしたのも、色々理由があるのだろう。だいぶ前から、DirectXはPCの物だけではなく、XBOXのようなゲーム機で使われるようになった事、GPUメーカーがほぼNVIDIAとAMDに限られて、従来のような「グラボの差異の吸収」の役割は大きくなくなってきた事、更にすでに高級関数を必要とするような、素人っぽいプログラマがいじれる領域を超えるほど3D描画の性能も需要も上がってきた事、などが考えられる。

 これを書いている2019年現在では、NVIDIAのRTXシリーズをターゲットに、Direct3Dの機能に「DirectX Raytracing」が追加された。名前の通り、レイトレーシングのライブラリである。
 レイトレーシングとは、従来のポリゴン描画と全く違う仕組みで3D描写を行う。光線の反射・屈折などをシミュレーションするので、テカテカの球や、半透明の液体などの描写のリアリティがかなり向上する。そのかわり、メチャクチャ処理性能を必要とする。
 80年代、8ビットや16ビットのPCでも、レイトレーシングに挑んでいた人たちはいた。静止画のみならず、動画を作っていた人もいたが、何しろ当時のPCの計算能力では、1枚の画像を作るのに、数時間とか、あるいは数日という単位をかけてまで作るものだった。だから動画となると、途方もない時間がかかる。それを短縮するために、レイトレーシング専用のアクセラレータ、コプロセッサなどが発売された事もあったっけ。それなりの値段がしていたと思うけど。
 それが今では、グラボとDirectXの組み合わせで、リアルタイムのゲームで可能になってきたのだ。凄い時代である。

 では、話を戻して、2004年くらいのDirectXで何を作っていたか…というのを次回してみたい。


前のMCLへ  次のMCLへ

戻る

TOM 2019