CGと奥行き
コンピュータグラフィックス(CG)の原理的なことや歴史的な移り変わりに興味があります。CGも絵の一種であるため、絵について一般に語られていることはまあまあCGのほうでも当てはまるのですが、CGはコンピュータという機械によって出力されている点で独特の経緯を辿っている部分もあると感じられます。
まずは奥行きについて。例えば、遠近法、は絵画において話題にあがる要素の一つです。家庭にファミコンが普及した80年代以降、コンピュータゲームの画面にも背景とキャラクターがあって、そこでは奥行きの表現が用いられていることは馴染みあるものとなりました。90年代のWindows普及以降は、PCの画面にはウィンドウがたくさん表示されて、ウィンドウには前後の重なりがあることにもみんな慣れてゆきました。ゲームの画面もPCのウィンドウも、コンピュータで描画されている以上は一種のCGであると考えることができます。今回、書き留めておきたかったのは、こうしたコンピュータが描画する仕組みとしてのCGの話です。
ウィンドウを重ねて描画する方法について、2020年の夏に飯塚さんとお話をしたことがあって、下の飯塚さんの記事でも引き続き触れられています。わたしのほうでもあれから考えたことを書きたいと思います。
奥行きあるCGのはじまり
私は歴史を好むため、コンピュータを用いてグラフィックスを描く仕組みについて、いったんサザランドのSketchpad(1963年)に立ち返ることが多いです。SketchpadはCGツールの祖、とくにCADの原型となったシステムで、いま思いつくような基本的な機能の多くを備えていました。描画はライトペンを用いて、CRT(ブラウン管)に対して直接指示することができました。図形はベクター形式で、拡大縮小、移動、回転、マスター図形からの複製(インスタンス生成)などの機能を持ちます。CRTはベクタースキャンですので、現在みられるようなラスタースキャンのビットマップディスプレイとは方式が異なります。
これらはいまでもポピュラーな機能ですが、実現のためにはTX-2と呼ばれる巨大な専用コンピュータが必要でした。TX-2は空軍の資金で作られた高価なコンピュータで、部屋全体が1つのコンピュータシステムを構成します(写真はこちら:Photographs | TX-2 Project)。機械は高価でも、CGツールに求められる機能は変わっていません。つまり、いまでもCGツールを実現するために必要とされる仕組みの検討は、当時から始まっていたと言えます。
同年、ティモシー・ジョンソンによって拡張されたSketchpad IIIでは、3Dの奥行きを示すパースペクティブも作図可能となっています。ただし描画はワイヤーフレームであり、手前の面によって背後の面が隠される隠面消去は実装されませんでした。これは当時の技術的な制約でしたが、まずは、透視図・正面図・側面図・平面図といった投影法は、CGツールの最初期から導入されたものだと言えます。
Sketchpad IIIのデモ映像は、こちらで一通り見ることができます。だいぶ面白いので初見の人はご覧になってください。英語ですけど今のYouTubeだと日本語の自動翻訳字幕も翻訳音声もだせますのでとっつきやすいと思います。
CGの技術において常に課題となるのは、どこからどこまでの範囲を画面に表示するか?を決めることです。Sketchpadでは図形を拡大表示することができますが、画面は9インチしかないため画面の外へはみ出る部分がでてしまいます。はみ出た部分はスクロールで表示すれば良さそうですね。さて、このとき、画面には図形のうちどこからどこまでを表示するのか?ということを、画面のサイズと図形の位置と図形のサイズ、そしてスクロール位置から定まる視野(スコープ)に基づいて計算する必要があります。もちろん、Sketchpadはこの計算処理を行っています。円がはみ出ている場合には弧の途中から描画することになりますし、この処理は難しかったようです。こうした処理は一般にビュー変換と呼ばれ、現在のCGでも全体像と部分画像、拡大図と縮小図の表示、そして3D空間内の視野に収まる範囲を定める際に必要となります。
視野に基づいて表示する範囲を定めることは、表示のために必要なメモリや計算の量を減らすことにも役立ちます。コンピュータに搭載されたメモリの量と演算装置の計算能力は、つねにCGの描画技術の制約となります。ここでは、CGで奥行きを描画する際に高性能のコンピュータが用いられた例を、もうひとつ紹介したいと思います。
支持体としてのビデオメモリ
1970年代のSmalltalk環境では、ダン・インガルスのビットブロック転送(BitBlt)によってスタック型のマルチウィンドウ*1の描画が実現されました。マルチウィンドウでは、前面のウィンドウは背後のウィンドウの一部分を隠すように描画されます。さて、この前後関係は、どのようにして描画されたのでしょうか?
当時ダン・インガルスがとったのは、隠面消去の研究ではZソート法、または画家のアルゴリズム(Painter's algorithm)と呼ばれる手法でした。画家が油絵を描く場合、まず部屋の奥の壁を描き終えて、次に、手前にあるテーブルを壁の上に塗り重ねで描いて、最後にテーブルの上の林檎を塗り重ねで描けば、手前のものが奥のものを隠した奥行きを描くことができます。コンピュータのマルチウィンドウの場合も、まず奥のウィンドウを描いて、その次により手前のウィンドウを塗り重ねて描けば同じことができそうですね。
コンピュータの画面に表示されている内容は、コンピュータのビデオメモリ(VRAM)内のフレームバッファと呼ばれる領域にピクセル値として格納されます。このピクセル値がディスプレイ装置へ転送されると、わたしたちの眼で見ることができるようになります。Zソート法とは、原理としては、このビデオメモリ(フレームバッファ)の上に、奥にあるものから順に塗り重ねで描いてゆく手法です。この方法を取る場合、油絵がキャンバスを支持体とするように、コンピュータはビデオメモリを支持体として奥行き順に絵を塗り重ねて、わたしたちに見せているということになります。
しかしこのZソート法は、どのようなコンピュータ環境にも最適というものではありませんでした。当時のSmalltalk環境が動作したAltoコンピュータは、とても高価な機械です*2。 高価な機械では効率の悪い方法でも動作しますが、普及型の機械ではそうもゆきません。CGがわたしたちの手に届くために、奥行きの実現はこの支持体から離れる必要がありました。
支持体から論理の空間へ
Smalltalk環境におけるマルチウィンドウのことを知ったビル・アトキンソンは、当時の普及型のコンピュータ「Macintosh」(1984年)でも同等の描画を実現できるQuickDrawを開発しました。Zソート法では手前のもので隠されて見えない部分もいったん描画する必要がありましたが、QuickDrawではこの見えない部分を描画しません。各ウィンドウの座標と縦横サイズと重なり順さえ決まっていれば、あとは計算によって、他のウィンドウによって隠されていない領域を複数の矩形領域(region)の和集合として求めることができます。例えばL字型の領域ならば2つの矩形の和で表現できます。その計算結果の領域内のみをビデオメモリへ書き込むことで、普及機の演算能力でもスムーズに表示できるようになりました。また、アルゴリズムは高速で、プログラム自体もコンパクトに作られていました。
人間はこのような手順で奥行きを描くでしょうか? 矩形を作ることはしませんが、それ以外はやや近いことをやっているように思われます。先ほどは油絵の手順でしたが、手書きのドローイング、とくにスケッチやデッサンの場合は、エッジの交わりを見たままに書いてゆくことが多いと思います。そこでは陰線あるいは隠面となる部分を先に描いて、あとから消すということはあまりなさそうです。ただ、CGツールのレイヤが普及してからは事情が変わって、技法としては油絵のようなメディウムの隠蔽力を用いたものに限らず、どんな場合でも、Zソート法つまり画家のアルゴリズムを人間の画家がとる機会が増えたように思います。
1980年代以降、メモリが安くなるにつれてコンピュータ機器には多くのメモリを搭載することができるようになりました。そのなかで、画面表示のちらつきをなくすために、いったんオフスクリーンと呼ばれる別のメモリ領域へ描画してから、フレームバッファへまとめて転送される方法が標準的に用いられるようになりました*3。こうして、フレームバッファは直接描画される支持体ではなくなってゆきました。
その後のマルチウィンドウは、ディスプレイへの出力処理を担うビデオカードの表示性能の向上、とくに3D能力の高いGPUの普及により姿を変えてゆきます。機器に搭載できるメモリが増えて、フレームバッファ以外の用途に使える領域も多く確保できるようになった結果、3DCGの世界ではZバッファ法と呼ばれる効果的な隠面消去の手法が普及しました。このため、2000年代の一般向けコンピュータでは、OSのマルチウィンドウ処理にも一貫してZバッファ法が用いられるようになりました。*4。
Zバッファ法を用いたマルチウィンドウでは、ウィンドウの奥行きに基づいて矩形で切り抜くことはしません。代わりに、複数のウィンドウを仮想的な3次元の空間内へ配置して、デスクトップの視野に収まるようビュー変換を行います。ここで、3次元空間内のウィンドウの位置は、ウィンドウ同士の奥行きの前後関係を正しく反映させています。その一方で、どのウィンドウを先に3次元空間へ配置しても問題はありません。Zソート法では画家がキャンバス(支持体)上に油絵で奥行きを描くときのように、必ず奥のウィンドウから描く必要がありました。Zバッファ法ではZバッファという論理上の奥行きを保持するビデオメモリ領域を用いて前後関係を演算します。具体的な存在である支持体への直接の描き込みは手順に縛られるのですが、Zバッファ法では奥行きを抽象的に扱うことで、手順に縛られない描画を可能としました。
以上ではマルチウィンドウを例題として、CGを表示する処理の歴史上、メモリの増加や演算装置の性能向上とともにオフスクリーンやZバッファ法が採用され、ビデオメモリのことを当初のような単純な支持体とは呼べなくなっていった様子を紹介しました。コンピュータにおける処理手順は、最初のうちは人間の手順を真似ることがありますが、コンピュータにとってより効率的な方法があれば変わってゆきます。その処理は具体的なハードウェアを離れ、抽象化されてゆきました。高度に抽象化され効率的となったコンピュータは、再び人間に具体的な価値を提供することになります。いまではハードウェアのことはあまり意識することなく、CLIP STUDIO PAINTのようなアプリケーションのキャンバスで、人間の画家が厚塗りを楽しめる時代となっています。
*1:ウィンドウ同士が重なることができる場合はスタック型、重ならない場合はタイル型のマルチウィンドウと呼ばれます。以下ではスタック型であることは前提として書いてゆきます。
*2:一般販売されなかったため正確な価格をつけられませんが、Computer History Museumによると当時の40,000ドルとなっています。物価上昇からみて現在では数倍以上の価値でしょう。Alto I CPU with monitor, mouse, keyboard and 5-key chording keyset - CHM Revolution
*3:QuickDrawやWindowsのGDI。
*4:オフスクリーン上で全てのウィンドウをいったん描画して、その際に奥行きに基づく合成処理を行ったのち、フレームバッファへ転送する方法は、コンポジット型のウィンドウマネージャと呼ばれています。この方法は2D処理でも可能ですが、その場合はZソート法を用いる必要があります。この処理に3D処理のZバッファ法を用いたものとして、普及機ではmacOSのQuartz Composition、Windows Vista以降のDWMが知られています。