グラフィックスAPI

draft CG

CGのプログラムは、GPUの回路を直接動かすのではなく、あらかじめ用意された関数を呼び出して描画を指示します。この呼び出し方を定めた取り決めがグラフィックスAPI(Application Programming Interface)です。
ここでは、広く使われているAPIと、GPU上で動くプログラムを書くための言語を見ていきます。

OpenGL
CG

OpenGLは、3次元CGの描画に最も広く使われているグラフィックスAPIです。仕様は特定の企業が抱えるものではなく、OpenGL ARBという業界団体によって策定されてきました。この成り立ちから、特定のプラットフォームOSに縛られず、Windows向けに書いたコードをmacOSやLinuxでもほぼそのまま動かせます。

ただし、OpenGLが引き受けるのは描画そのものだけです。ウィンドウを開いたり、マウスやキーボードの操作を受け取ったりする処理は仕様に含まれておらず、その書き方はOSごとに異なります。そこで、この差を吸収するユーティリティライブラリとしてGLUTやGLFWを組み合わせて使います。

OpenGL ES

スマートフォンや携帯型ゲーム機のように、搭載できる回路も使える電力も限られた機器では、OpenGLの機能をすべて備えることができません。こうした組込み機器向けに機能を絞り込んだ仕様がOpenGL ESで、iOSの描画基盤や3DSなどに採用されています。

WebGL

3次元CGをWebページで見せるには、かつては専用のプラグインを入れてもらう必要がありました。これを不要にしたのがWebGLです。OpenGL ES 2.0をもとにJavaScriptから呼び出せる形へ整えたAPIで、対応するWebブラウザさえあれば、追加のソフトウェアなしにGPUを使った描画を行えます。

DirectX
CG

OpenGLがプラットフォームOSを問わないのに対し、DirectXはMicrosoft社が自社の環境向けに用意したAPIです。Windowsのパソコンや家庭用ゲーム機で使われ、描画の他に音声の再生や入力機器の扱いまで含んだ、複数のAPIをまとめた総称になっています。このうち3次元CGの描画を担当する部分がDirect3Dで、OpenGLと同じ役目を果たします。

プログラマブルシェーダ
CG

初期のグラフィックスハードウェアでは、座標変換や陰影付けの計算方法が回路として固定されており、APIから指定できるのは光源の位置や色といったパラメータだけでした。この固定された処理を自作のプログラムで置き換えられるようにしたものがプログラマブルシェーダです。GPU上で動く小さなプログラムを書き、描画処理の流れ の決められた位置に差し込みます。

差し込める位置は、次の3つに分かれています。

  • 頂点シェーダ:頂点1つごとに呼ばれ、座標変換や頂点ごとの色を計算する
  • 幾何シェーダ:三角形などの図形単位で呼ばれ、頂点を増やしたり減らしたりできる
  • ピクセルシェーダ(OpenGLではフラグメントシェーダ):画素1つごとに呼ばれ、画面へ書き込む色を決める

これらは描画の流れに沿って並んでおり、図形がラスタ化 されて画素になるまでを頂点シェーダと幾何シェーダが、そこから先をピクセルシェーダが受け持ちます。

テッセレーション

ポリゴンをはじめから細かく分けておけば、滑らかな曲面を表せます。ただし、その分だけデータ量が増え、遠くにあって小さくしか映らない物体にまで同じ密度を持たせることになります。そこで、粗いポリゴンをGPUの側で分割し、必要な場面でだけ密度を上げるテッセレーションが、頂点シェーダと幾何シェーダの間に加えられました。

分割は3つの部品の連係で進みます。ハルシェーダが分割の細かさを決め、テッセレータが実際に頂点を作り、ドメインシェーダがその頂点を曲面上のどの位置へ置くかを計算します。このうちテッセレータは処理が固定された回路で、プログラムで書き換えられるのはハルシェーダとドメインシェーダの2つです。

ハルシェーダとドメインシェーダはDirectXでの呼び名で、OpenGLではそれぞれテッセレーション制御シェーダ・テッセレーション評価シェーダと呼ばれます。

シェーダプログラミング言語
CG

シェーダは、C言語に似た専用の言語で記述します。これをシェーダプログラミング言語といい、書いたソースコードはコンパイラによってGPUが実行できる形式へ変換されてから動きます。

使う言語はAPIごとに決まっています。OpenGLで使うのがGLSL、DirectXで使うのがHLSLです。NVIDIA社が開発したCgは、どちらの環境からも扱えるように作られました。

これらはいずれも、1秒間に何十枚もの画像を描き続けるリアルタイム処理を前提にした言語です。1枚に時間をかけられる映像制作では、質を優先したRenderMan のようなシェーダが別に使われます。

シーングラフ
CG

OpenGLやDirectXが受け付けるのは、「この頂点の並びを三角形として描け」という水準の指示です。物体どうしの親子関係や、光源とカメラの配置をまとめて扱うには、その仕組みをアプリケーションの側で組み立てることになります。

場面を構成する形状・変換・光源・カメラを木構造で表し、この構造ごと描画を任せられるようにしたAPIもあります。ここで使われる木構造がシーングラフで、親の節点に与えた移動や回転は、その下にぶら下がる形状すべてに及びます。Javaから使えるJava3Dは、この考え方で3次元CGを扱うAPIの1つです。

GPGPU
CG

GPUは、多数の演算器が同じ計算を一斉に行う構造をしています。頂点や画素は互いに独立して計算できるため、描画ではこの作りがそのまま速さに繋がります。

同じ性質は、描画以外の計算にも当てはまります。物理シミュレーションや画像処理のように、大量のデータへ同じ演算を繰り返す処理をGPUに担わせることをGPGPUといいます。そのための開発環境として、NVIDIA社のCUDA、機器の種類を問わない標準規格のOpenCL、DirectXの一部として提供されるDirectComputeが使われます。

描画のために作られたGPUは、こうして並列コンピューティング の基盤としても使われるようになりました。CGの描画そのものをGPUがどう受け持っているかは、GPUを利用したCG処理 で学びましょう。