VR環境(QUEST2)でスペクトルのウォーターフォール表示を作成してみる
はじめに
SDRでのスペクトルの表示は以前からできておりましたが、やはりSDRのソフトを見るとどれもウォーターフォール表示があります。こういうやつです。
通常はPCのディスプレイが2Dで表示するために色で表現をしていますが、VRで表示する場合に同じで意味があるのか?そもそもVRならではの表示があるのではと考えていました。
下調べ
点を表示するのに調べていたら下記がとてもきれいでした。
ですが、今回の目的とはちょっと違うかも。
いろいろググっていたらこのようなのでイメージに合う気がしました。
ここから思い出したのは先日作成したアンテナ特性のシェーダーのようにsurfaceシェーダーでスペクトルデータを描けばそれでいいのでは・・・これなら意外に簡単に書けるかも
Surfaceシェーダーで作成してみる
以前と同じように、サイズは16*32で小さい値でまずは進めます。
面をつけて、レベルごとに色を変えるとこんな感じ
こうなると線は邪魔なので、消します。そして256*512のサイズにしてみたものが下記になります。なかなかよさそうです。
こうなると実際にRTL-SDRから取得したデータで表示したくなります。
そこで問題になるのが、今回はデータを作ってから表示していますが、スペアナのデータは1回ごとにデータが追加される形になります。これに合った状態にしないと移植できません。
またサイズを大きくすると表示がされないことに気が付きました。どうもデフォルトだとメッシュの数が16bitで65536で制限があるようです。
デバッグのログで表示させると確かに65536になってしまっています。
下記1文を追加しました。
mesh.indexFormat = UnityEngine.Rendering.IndexFormat.UInt32;
ちゃんと65536よりも増えて表示できるようになりました。
下記記事によると、メッシュの結合を使えば処理の負荷が得るようです。今回のスペクトル表示のように1回ずつメッシュが増えるような場合は有用かもしれません。
FFTの数が1024にして実行すると、異常に動作が重く、処理時間がかかっていることがが判明しました。
結果「Surfaceシェーダーでは処理が重い」ので見直し
点だけのシェーダーで再トライ
下記を参考に変更してみました。
点で表示にした結果ですが、点が小さすぎて表示がよろしくないです。乱数なので色や位置はノイズのような感じになっています。
いろいろしらべたのですがなぜかサイズの変更ができない。その後調べ続けて下記を見つけました。
う~ん、こんな罠があったのか。
PC上で実行してずっと悩んでおりましたが、QUESTで動作させたらちゃんとサイズが変わっていました。
点の大きさを変えてQUESTでスクリーンを撮ってみました。ランダムデータなのでスペクトルっぽくはないですが、思い通りの動作になっていそうです。
スペクトルを実際に表示させてみました。だいぶ初めのイメージとは違ったものになりましたが、これはこれでいい感じです。
これをもとにVRでのスペクトル表示環境を引き続き作っていきたいです。