Windows 上で点群を表示する機能を実装してみたくなったので作ってみます。
手元のノートPCではGeForce とか使えないけど、100億点位は表示してみたいなあ。
記事の予定
- DirectX11 を使ってみる
- DirectX で点を表示してみる
- 100万点を表示してみる
- 大規模点群を表示する作戦を考えてみる
- プログレッシブ表示とLODを実装してみる
- 点群分割を実装してみる (10億点)
- pts ファイル読み込みを実装してみる (2億点)
- 点群のピック機能を実装してみる
おまけ
目論見書
作りながらも更新しています。悪しからず。
目標
- 3D点群ファイルを表示する機能をWindows上で試作する。点数としては10億点位は最低限目指す。 (GPUにデータを全部乗っけることは不可なレベル。)
- それなりにチープな環境で動かすことを目指す。 CPU 内臓のGPUで動けば、まあまあ満足するかなという目論見。
詳細を補足します。
- 試作ということで、大体こういう作りをすれば表示できそうだなということが分かるところまで(または無理ということが分かるまで)作ることにします。
- 100億点→10億点の違いは根性のなさです。
- スキャナがないので点群情報は自作します。
- 1m×1mの平面に 1mm ステップで点を打てば100万点、それを1000枚用意すれば簡単に10億点の点群も用意できるということに気づき、やってみる気になりました。
- 開発用にはこういう単純なデータの方が都合もよいし。
- 静岡県のデータとかはいずれ試そう。
- CPU 内臓のGPUで動けばいいかなと思ってましたが、実際試したところ思ったより動くようです。 OpenGL と相性が悪いだけなのかもしれません。 試してみるものですね。
- ということで、グレードダウンしてDirectX のリファレンス実装で動かすことにするかもしれません。
- CPU(非グラフィック機能)、メモリ、ディスクにどれくらい依存するかは未定、というか今回の技術調査の目的の一つですね。(アウトオブコア前提なので、基本的には点群データをSSDに乗せることは避けられないが...)
前提とする環境
- CPU は Core i5-8250U (1.6GHz)
- Core i5 をチープと言ったら怒られそうですが、最新なわけではないですしご容赦を。
- GPU は Intel UHD Graphics620 を使用してます。
- 「ギリギリ軽めの3Dゲームまで」使えるそうです。(参考)
- 開発環境は Visual Studio 2019、C++
- たまたま手元にあった開発環境です。
- 3D 描画には DirectX11 を使用します。
- 3D表示をしたいだけなので 12 だと面倒かなあというのと、11 なら十分情報が落ちているだろうという算段。(12でも十分あるのかな。またいずれ。)
- OpenGL だと GPU を選ぶ印象。 DirectX ならそういうこともないかなあという期待のため。(DirectX 初体験です。DirectX を使ってみたかっただけでもある。)
- Windows デスクトップアプリケーションの構築には MFC を使います。
- ここは今回のこだわりポイントではないので、一番慣れてるものということで採用。 Visual Studio2019 なら問題なく使えるようだし。
- RAMは16GB。
- メモリもチープとは言えないですね。主な用途はファイルキャッシュになる見込みです。
- システムドライブは SSD で 200GB 超(カタログスペック的には256GBかな?)です。
- 100億点の点群をファイルに書くと150GB位になりそうで、ちょっと足りない...