2020年2月20日木曜日

ポストエフェクト

 普通にレンダリングすると、こんな感じ。





***

 頂点ベクトルを使うと、こんな感じ。





 表面がスムーズになる。
 中心が原点にある球体なら、頂点位置を正規化すれば、頂点ベクトルとして使える。
 円筒の場合、ある軸を中心軸として使うのであれば、その軸をゼロにて正規化すれば、頂点ベクトルとして使える。

***

 本題。
 輪郭のポストエフェクト。輪郭のサンプルには使いづらいデータだけど。。。







 上から、エフェクト無し、深度でエフェクト、法線ベクトルでエフェクト。
 深度でエフェクトをかけた場合、円筒のエッジのような、深さ変化が大きい部分ではエフェクトがかかっているが、衛星の周りのように、深度差が少ない場合にはエッジを検出できない(閾値による)。
 法線ベクトルでのエフェクトでは、衛星の周りにも輪郭線が出ている。

 谷折りのような形状の場合、接続部の深度差はゼロなので、深度差でエフェクトを作ることができない。ベクトルの場合は、谷折りの検出もできる。
 一方で、同じ向きの面が前後にあるような場合(例えばドミノが奥行方向に重なっているような状態)で、エッジがキッチリ出ている場合は、前の面と奥の面のベクトルが同じになってしまうので、検出できなくなる。この場合は、奥行方向の情報量が得られるので、深度でならば検出できる。


 法線ベクトルの場合、閾値を大きくすると、ドット積が大きくても(=面の角度差が小さくても)、エッジとして検出できる。



 ワイヤーフレーム風の表示ができるのが面白いかな。計算量はかなり多いので普通にワイヤーフレームでレンダリングしたほうが良いけど。
 球の上部や下部のポリゴン密度が高い部分では、隣のポリゴンとの角度差が小さくなるので、エッジを検出できていない。
 もう少し複雑なデータをレンダリングしてみると、谷折り部分で輪郭が出るので、全体的に引き締まった印象になる。ライセンスの関係で(以下略

 当然ながら、頂点ベクトルで補間を行うと、ワイヤーフレーム風のエフェクトは表示できなくなる。


 ちなみに、今回は内部処理を少し変えて、陰影処理を少し変えている。
 今まではラスタライズ時に陰影の計算も行っていたが、法線ベクトルバッファを作ったので、あとから任意のピクセルの法線を得られるようになったので、ポストエフェクトで陰影処理ができるようになった。
 これと言って利点はないが、ラスタライズ時に考える事が減るのが利点か。パイプライン化に便利かな。あとは、大量のポリゴンが重なる場合、後から消されるポリゴンの陰影処理が不要になるので、景色のレンダリング時等は、若干のパフォーマンス改善が得られるかも。
 後から機能を追加しようとすると困るかもな、とも思いつつ、深度バッファを参照すればスクリーン座標が得られるし、グローバル座標も計算できるし、機能追加の予定もないので、パイプラインの簡素化を優先したい。

***

 今の所、ベクトル演算(Vector3やQuaternion等)は自作ライブラリでやっているけど、新し目の環境だと、NuGetからSIMD対応のライブラリを入れれるらしい。ベクトル演算ゴリ押しなので、SIMD対応できるとそれはとっても嬉しいなって。
 いや、GPU使えよって話なんだけどね。。。

***
追記
 NumericsでSIMD対応にしたら3倍位早くなって騙されてる気分…… ベクトル演算ゴリ押し(処理)ってベクトル演算(アーキテクチャ)効くんだな。なんかインスタンスメソッドがネックだったんじゃね?って気も若干するけど。スタティックメソッドに書き直すのめっちゃ大変。。。まぁ、苦労した価値はある。
 処理内容は、自作ライブラリと同じだった。さほど個性的な実装をしてるわけでもないけど。

 ARMコアって、「乗算して加算」(ベクトル回転に使う)が1命令でできたりするらしいけど、x86とかx64ってそういう事できるんだろうか? CISCの独壇場みたいな命令だけど。

***

 3Dデータ、スミソニアンとかNASAもいろいろ作って配布してるらしい。
 スミソニアンはアポロのハッチのデータとか公開してるけど、OBJをZIPに入れて150MBってどういうこと……
 NASAはblend形式っぽくて、そのままだと読み込めない。

 qiita曰く「Blenderは25年前のデータも読み込める互換性すごい!」らしいんだけど、中身はメモリダンプに近いらしい。それ悪名高いDXFと同じようなやつ…… ファイル読みながらバージョンに合わせて処理変えていくらしくて、ファイルフォーマットとしての互換性が高いんじゃなくて、フォーマット変換でゴリ押ししてるだけじゃね、感。
 最近のペイントソフトは拡張子に意味をもたせていないので、拡張子が何であろうと、読み込むことができる。例えば、Wndowsに付属するmspaint.exeは、拡張子を*.txtに変更したPNGファイルですら読み込める。でも、これを「テキストファイルも画像として読み込めるペイントソフト!!互換性すごい!!!」とは言わない。はず。

 結局、何が言いたいかというと、OBJ読み込むだけでも苦労してるのにこれ以上他のフォーマットに対応するのは嫌だ。

 スミソニアンって、収蔵物の1%しか展示できてないので3Dデータ化して公開する、とか言われてる割に、まだ数百個くらいしかデータ化してないんだな。13年の開始当時で数十個とかから考えると、収蔵物のデータ化終わる前に人類史終わりそう。1年にn個データ化できるコンテンツ屋さん vs 1年にm個収蔵物を増やす博物館。たかし君問題!!
 NASAもある程度の数はダウンロードできるとはいえ、さほど大量にデータ化してるわけじゃないので、アメリカの機関はフットワーク軽くて3Dデータ流行ったときに乗っかったけど続かなかった、みたいなオチじゃないかと。。。スミソニアンの数百MBみたいなアホみたいにでかいデータじゃなく、数MBのオーダーなので、バイナリであることを考えても、ポリ数はさほど多くない気がする。


 とりあえず、レンダー側の設計がかなり変わったので、しばらくリファクタリングがんばる。。。

0 件のコメント:

コメントを投稿