Stage3D の裏側のお話

Flash Player 11 から追加された Stage3D は、GPU を Flash コンテンツからフル活用するための機能です。

3D 描画だけでなく 2D 描画にも利用できるので、Stage3D という名前はいささか誤解を招くものかもしれません。従来の、CPU で描画される Stage との違いを明確にするには、StageGPU とかのほうが合っているような気がします。

で、どんなときに Stage3D が使えて嬉しいかと考えてみたときに、高度な 3D 描画を実現したい場合というのは分かり易い例かもですが、デバイス (スマホ/タブレット) 向けコンテンツのパフォーマンスを向上させたい場合の方が、もしかすると多くなるような気もします。

CPU 描画は、1 画素ずつ CPU で描画データを計算します。そのため、CPU のスペックが低くて、描画する画素数が多い環境は苦手とします。

そうすると、一般的なデバイスは PC より CPU のスペックが低い割には小さな画面でも高画素と、CPU 描画には厳しい条件を持っているようです。今後、CPU の性能が向上していくとしても、ディスプレイの精細度も向上するだろうと考えると、当面 CPU 描画に厳しい状況は続きそうです。

一方、GPU 描画は画素数の影響を受けにくい上に、デバイス用の GPU の性能向上は CPU の性能向上を (いまのところ) 遥かにしのいでいるようです。だとすると、デバイスを意識したコンテンツでは、描画 (の少なくとも一部) を GPU で行うのは理にかなった選択になるのかもしれません。

とはいえ、GPU が高速に行うのは決まった処理だけで、CPU の様な柔軟性はありません。

なので、GPU (Stage3D) を使う以上その特性を理解しておかないと、3D コンテンツの制作時はもちろん、たとえ Starling で 2D アニメーションをつくる時でも、思い通りの表現やパフォーマンスを実現できない場合は出てきそうです。

加えて、そもそも GPU の動作の仕組みの知識無しには、Stage3D の API の使い方の理解も困難です。ということで、以下は、一般的な GPU 描画の仕組みと Stage3D の特徴についての概要です。

3D 空間の定義

2D 描画は、常に Z 座標の値が 0 の場合の 3D 描画、すなわち 3D 描画の特殊なケースと看なせます。ということで、ここからは 2D 描画であれ 3D 描画であれ、GPU の描画プロセスとしては同じと考えて、3D 描画のみ扱うことにします。

さて、GPU が処理する 3D 空間は、どのように表現されるのかという話ですが、

一般的に、GPU が処理する 3D 空間内のオブジェクトの形状は、3 角形のメッシュ状に分割された状態で定義されます。この 3 角形をポリゴンと呼んだりすることもあるようです。そして、それぞれの 3 角形は、3 次元 ( X 軸、Y 軸、Z 軸) の座標値を持つ頂点 3 つで表されます。

つまり、GPU にとっての 3D オブジェクトは、"頂点の集合 + 3 角形を成す頂点の組み合わせ情報" (と色の決定に必要な情報) から構成されるというわけです。

GPU にこれらのデータを渡すと、GPU メモリと呼ばれる専用の領域にアップロードされてキャッシュされます。あとは、カメラや光源などの情報を渡せば、GPU が描画データを作成してくれます。これなら CPU 使用率は下がりそうですね。

GPU 描画は "3 角形の描画" という定形作業の繰り返しなので、専用のハードウェア (GPU) による処理の並列化 & 高速化に適しています。並列処理ができるので、多くのポリゴンを同時に扱えたりもします。このあたりが、GPU 描画の有利な点です。

ただし、GPU 描画では、オブジェクトの形状を 3 角形のメッシュとして表現するため、曲線は直線の組み合わせで近似されます。そのため、CPU 描画と比べて線の描写が荒くなるケースなども出てくる可能性があります。こちらは GPU 描画の弱点と言えるでしょう。

精細度が高い画面では、描画する画素数が増えることから CPU 描画には不利になり、線の荒さが目立ちにくくなることから GPU 描画には有利になります。この点からも、デバイスは GPU 描画が使い易い環境だと考えられます。

ともあれ、ものすごくおおざっぱに捉えれば、GPU は、小さな沢山の 3 角形を高速に描画する装置と考えて良さそうです。

3D 描画処理の手順

GPU による描画は、大きく 2 つのステージに分けられます。3 角形を扱うステージと、ピクセルを扱うステージです。

3 角形を扱うステージでは、

  1. カメラの位置を基準に頂点を投影
  2. 頂点から 3 角形を形成
  3. ビューポートに合わせて 3 角形を切り抜き

などが行われます。ここまでで、位置や形に関する情報が決まります。

ピクセルを扱うステージでは、

  1. 頂点情報からピクセル情報への変換
  2. 各ピクセルの色の決定
  3. 表示データの一時保管

などが行われます。この段階で、各ピクセルの色、すなわち最終的な見た目が決定されます。

上で書いたように、GPU による処理は専用のハードウェアにより行われるのが基本ですが、上の 2 つのステージ各々に、シェーダと呼ばれるプログラムを読み込んで実行する機能が提供されます。これは、描画処理に柔軟性を持たせるのが主要な目的です。シェーダが導入される前は、GPU が提供する標準的な光源しか使えない等の制限ががありました。

2 つのステージのシェーダは、それぞれ、頂点シェーダと、断片 (ピクセル) シェーダです。頂点シェーダは頂点の座標操作を担当し、断片シェーダはピクセルの色情報の判断を担当します。テクスチャ (ピットマップ) を各ピクセルに割り当てるのは断片シェーダです。

シェーダはプログラムなので、他にも様々な機能を持たせることができます。例えば、動的に陰影や反射を追加、重なったピクセル同士をブレンド、フィルタを適用、などがよくある使われ方のようです。

シェーダの記述には、GPU 上での実行に最適化された特別な言語が使われます。Stage3D の場合、シェーダの記述には AGAL と呼ばれる言語が使用されます。

AGAL は低レベルの言語 (アセンブラ) で、開発生産性があまり高くないことから、PixelBender 3D というより高レベルの言語も開発されています。もちろん Stage3D に対応した ActionScript フレームワークを利用すれば、ActionScript だけで GPU を使ったコンテンツを制作することも可能です。

なお、Stage3D には、シェーダを使わないというオプションはありません。常にシェーダプログラムを用意する必要があります。

次回は、シェーダについてもう少し詳しく説明する予定です。

 

トラックバック(0)

トラックバックURL: http://cuaoar.jp/mt4/mt-tb.cgi/220

コメントする

2014年1月

Sun Mon Tue Wed Thu Fri Sat
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  
レンタルサーバー

月別 アーカイブ

Powered by Movable Type 4.261