« ポリゴン描画実験 | トップページ | Spectre/Meltdown脆弱性について考えてみる »

2018年1月14日 (日)

ZeroPath-GPUのC++モデルを書いてみた

以前Zyboにも収まるテクスチャキャッシュができたので、Zybo向けにテクスチャマッピングのできるフレームメモリレスの1パスGPU自作を検討中ですが、先立ってC++で簡単に実験してみました。

 思惑としてはピクセル走査順にピクセル値を計算していくことで

 ・ 描画時間が保証されている(リアルタイムシステムに使える)
  ・ フレームバッファやZバッファが不要
  ・ 描画ステージもバッファリングステージも無く、いきなり出力なので、超低遅延
     (ゲームとかのインタラクション向け?)
  ・ 映像クオリティーは一旦置いておいて、Zyboとかにコンパクトに入れ込みたい

 あたりを狙った描画方式を検討中です。

例によってソースはgithubで、

https://github.com/ryuz/render_model/blob/master/JellyGL.h?ts=4

境界チェックとかこまかいところで時間食いましたが、原理的にはシンプルな作りで意外と行けそうですね。





 上記は1キューブ6面で合計12ポリゴンですが、テクスチャマッピングと組み合わせれば、少数のポリゴンでもそれなりに遊べそうです(もちろんテクスチャ座標を色に変えれば普通のグーローシェーディングも可能です)。
  エッジ数が24個、uvwのパラメータが24個で、32bitのカウンターが48個で上記描画に必要なパラメータは求まる見積もりです。
  初期計算(行列演算だけ)floatでARMにやらせればよいので、Zyboでも十分入らないかなと、取らぬ狸の皮算用中です。

 ポリゴンの数がハードウェア規模で律速する変わりに、フレームバッファもZバッファも不要でちゃんとZ判定まで動くので、意外に実用になりそうな気もします。

 かつてディスプレイがVGA(640x480)で、1個のCPUが描画していた時代に比べて、現在のGPUはシェーダーが数千個のオーダーで搭載されていたりします。

 画像サイズが 4k でも 30倍程度にしか増えていないのに、シェーダーはかなりのレートで増えてきていますので既存のGPUの描画方式では

  そのうち、ポリゴン数やシェーダー数がピクセル数超えるるのでは?

  といった議論は昔からなされていたとおもいます。
(いつかレイトレーシングとかの方が速くなるんじゃない? といった話も聞いたことがありますし。)

 既存GPUの計算方法では、Z方向に重なり合ったピクセルは、別ポリゴンで上書きが発生した箇所については丸々演算結果を捨てることになります。

 今回とった方法は、アルゴリズム自体は従来のポリゴン描画の方法そのものですが、ピクセル順に計算しているのでZ判定以降の計算については無駄が無い筈です。

 またフレームメモリを持たないので、低遅延の描画ができるはずです。

 ポリゴン数がトランジスタ数で制約されるので、汎用性という点ではどうなんだというところですが、特定用途にて、トランジスタ数よりもメモリ帯域の方が貴重なケースなどはありえるのではなかろうかと思ってみたりもする次第です。

(追記:2018/02/14)
 マルチパスレンダリングとかの定義で言うと、1パスすらなくでいきなり出力を始めるので、ZeroPathにタイトルを変えました。

« ポリゴン描画実験 | トップページ | Spectre/Meltdown脆弱性について考えてみる »

FPGA」カテゴリの記事

コメント

この記事へのコメントは終了しました。

トラックバック


この記事へのトラックバック一覧です: ZeroPath-GPUのC++モデルを書いてみた:

« ポリゴン描画実験 | トップページ | Spectre/Meltdown脆弱性について考えてみる »