ドローコール

提供: MonoBook
2019年10月27日 (日) 01:38時点におけるimported>Administratorによる版 (→‎インスタンシング)
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)
ナビゲーションに移動 検索に移動

ドローコール(draw call)とは、CPUからGPUに描画依頼を行うことをいう。

概要

近年では「シェーダーの実行」を意味していることが多い。このためシェーダーの内容によっては描画を伴わないこともある。

ドローコールはとても重たい処理である。シェーダーで実行したいプログラムを設定して、シェーダーに渡すモデルやテクスチャマップや変数などを設定して、ドローコールをする。

GPUでの「処理」そのものよりも「呼び出し」の方が重いこともあるくらい。

ドローコールを減らす手法

1フレームの描画に必要な「ドローコールの数」は、フォワードレンダリングではシーン中にある「モデル」と「ライト」の数の掛け算となる。ドローコールはとても重たい処理である。その数を減らすことができればパフォーマンスが劇的に向上する。

インスタンシング

複数の同一モデルを1回のドローコールで描画する手法である。モデルは同一だが、「位置」や「向き」や「大きさ」だけが異なるという場合に使用できる。形状が変化しているものには使用できない。

DirectX10以降の世代のGPUでは「GPUインスタンシング」としてハードウェア実装されているので難しいことを考える必要はない。

一方でAndroidなどで主流のOpenGL ES 2.0DirectX9世代相当)では当然ながらGPUインスタンシングは使えない。ソフトウェアで擬似的にインスタンシングを行うことになる。

メッシュベイカー

メッシュベイカーは背景などに使用される複数のモデルを、事前に「1つのモデル」に結合してしまう手法である。建築物のように動かないモデルだと簡単に実装できる。

モデルを一通り読み込んだ後に結合すると利便性がよい。

結合する際にはハードウェア的に「インデックスバッファのサイズは16ビット整数(最大値65535)」と制限されている環境を考慮して65535インデックスの範囲内になるように結合するといい感じである。

遅延レンダリング

遅延レンダリングのように1回(1フレーム)の描画に複数のドローコールを伴う手法もある。

  • Gバッファの初期化
  • 拡散色を計算してGバッファに格納
  • 深度を計算してGバッファに格納
  • 法線を計算してGバッファに格納
  • Gバッファを結合

遅延レンダリングは、一見するとドローコールが増えて見えるが、「ライトが増えても常に一定数のドローコールに収まる」という特徴がある。

その他

少しでも高速化すべくドローコールをキューに積んで実際のドローコールは別スレッドで行うという「GPUを休ませない」という手法もある。

これが当たり前となっているフレームワークもあり、それを知らずに「ドローコールしたのに結果が返ってこない」とハマるケースもあるので注意しよう。