Unityでテクスチャにお絵描きするための線分描画アルゴリズム

はじめに

作ったもの

https://github.com/sotanmochi/SimpleDrawing-Unity f:id:sotanmochi-tech:20190711085649p:plain

実装した線分描画アルゴリズムについて

  • ピクセル単位で並列に処理して塗りつぶしていく
  • シェーダーで実装してGPUで並列処理
  • GPUで高速に処理することでピクセル数が増えてもFPSを低下させない
    ※ 1ピクセルあたりの計算式は複雑になっているが、GPUで並列処理することによって全体のスループットが向上する

実装の概要

  1. オブジェクトに対して「線を描け」と命令する(スクリプト
  2. 色・UV座標などの値をシェーダーに渡してBlit命令を実行する(スクリプト
  3. シェーダーはUV座標などの情報から塗るべき位置を判断して色をつけていく

線分描画アルゴリズム

  • ベクトル方程式、連立1次方程式、点と直線の距離などを使った
  • 詳細はスライドを参照 f:id:sotanmochi-tech:20190711101251p:plain f:id:sotanmochi-tech:20190711104912p:plain f:id:sotanmochi-tech:20190711104940p:plain

実装例

f:id:sotanmochi-tech:20190711115659p:plain f:id:sotanmochi-tech:20190711115722p:plain f:id:sotanmochi-tech:20190711115738p:plain

おわりに

  • データ並列で処理できるアルゴリズムに置き換えてシェーダーで実装することでパフォーマンスを改善できた
  • 今回はフラグメントシェーダー(ピクセルシェーダー)で実装するタイプの処理だったが、描画系ではない(レンダリングパイプラインから切り離せる)処理を並列化する場合はコンピュートシェーダーを使うのがオススメ