算譜の部屋。上に行くほど新しい。
ダウンロードは ⇒ marching_test.zip
参考は以下の「Cone Marching and Mandelbox Fractals seminar」から。coneまではまだやってない。
http://www.fulcrum-demo.org/tag/cone-marching/
raymarchingは重い。軽くしたい。
実はもうちょっと小さい空間でraymarchingすればいいんだけど遠くまで飛ばさないと気がすまない。
軽くするには資料がなかなか無いので適当に作り。
資料のとおりには作ってないんだけど事前に低い解像度で適当にraymarchingして取った深度だけのMAPを作る。
本解像度にレンダリングするときは、その深度MAPの値を初期深度として用いて無駄な計算をやめましょうというハナシ。
[右上]:
事前に小さい解像度から構築した深度MAP。
[右下]:
初期深度ナシで32回raymarching。遠くまでレイ飛ばせてない。
[左側]:
初期深度は深度MAP使用で32回raymarching。相当に違う。
単に事前計算でトントンになっていないか適当に計算。
以下のとおり(打ち切りや刈り込み考慮ナシ)
128x128 : 10回
256x256 : 10回
512x512 : 10回
1024x768 : 32回 ※最後のpass
合計レイ : 28606464 本
[参考]
1024x768 : 64回 ※もし素のままで大体同じ品質にする場合このくらいなんじゃないかな…
合計レイ : 50331648 本
ためしにGTX580ti + Corei7:860 + 16GMB Win64 + サンプルのfunction素でやってみた。
結果、64回程度だと動かしたりすると表皮がダメになる + 100fps落ち(大雑把過ぎ)
大体同じ品質でFPS稼げるのはでかい。あとは調整なんだろうな。
確かに最初から大体同じ品質にする場合よりは計算頻度押さえて、最後のpassでトレードオフで品質決まる。
資料のようにばっさり切り落とすのも楽勝。
高解像度で最初からmarchすると無駄な光線増える上に、キワの部分とかの粗がどうしても出るからこれは具合良い。
深度MAP構築がセンシティブ。構築するときに細かいobject踏み外していると見事にのこぎりになる。
深度MAPから深度引っ張ってくるときPOINTでサンプリングも試してみたけど、LINEARで構築したほうがなんかよさげ。
objectのキワの部分が仮にobjectふみはずしぎみだったとしてもなんとなく拾ってきてくれる(しょぼくはなるけど)
せめてraymarchingしてからcolor項計算するかしないかを決める感じがよさそうなんだけど、なんとも。
いまさらDX9つかってますが矩形きっちりテクスチャで描く場合-0.5するのが定石。
テクセルからピクセルへの直接的なマッピング
そのためshader側でVPOSからUV作る場合+0.5でサンプリングしないと踏み外す(どうでもいいかも)
[なんかへんなこと]
・多分深度MAP構築計算適当
・aspect比(ちゃんと計算しなさいという)
・小さいオブジェクトが死ぬときがある
このへんにしとく。
かの凄い人は25回とか小さい回数で小さい空間でレンダリングしている。見習うかな。
高周波成分含む領域と低周波成分含む領域別々にレンダリングして合成するのあったけど忘れた。
供養。
ダウンロードは ⇒ ssv.zip
メッシュ版は ⇒ ssvm.zip
参考サイト ⇒ t-pot様 : 両面ステンシル影
◆さらに参考になるのはMicrosoftのDirectXSDKについてくるサンプル。
息抜き。DOOM3に実装されているらしいです。なるべくソース小さく書いてみました。
あと、ステンシルシャドウ実装した事無かったのでサイト観ながらべんきょう。
ステンシルシャドウ独特のかっちりとした影が魅力です(サンプルでは32回ライト位置変更させてぼかしてますが…)
シャドウボリューム構築が一番だるい…。
CW, CCWの手順は踏まず、両面ステンシル機能使ってます。影は2ポリでちょっとずつつけてる。
頂点処理はソフトウェア。メッシュはロックして放り込むの面倒なのでとりあえず。
本当は巣カード一つだけで十分だけど裏ガワ全部放り込んでる。無駄。
後々破壊とか考えて。SetRenderStateをDWORDテーブルにまとめるともうちょっと見やすくなりそう
色々サンプルみて分かったんだけどDX9の実装、DrawPrimitiveUPでシャドウ描くの多いみたい。
まあ実際には使えない速度なのかもしれないけど手軽。
あとシャドウボリューム構築時にどこまで伸ばすか調べたら割と適当感。筒以外の部分もtestしているソースもちらほら。
DX11周りにさっさと移行するのが吉な気が。
シャドウボリューム構築
GPUで勝手にやってくれというノリだけどGSでサックリできそうな感じ。2011の某グラフィックス本に見直されていると記載されてた気が。
ポリゴン4枚で描画。
メモ。
arinko.zip
arinko2.zip ※ちょいきもいかも
リハビリその2。テクスチャに描画したのそのままplaneにあわせてraymarching。別にplaneでなくてもOK。
まあドット描画なのでカクカクしている。動くバンプマップ。
バンプテクスチャをいんちきブラー + 良いフィルタかければもうちょっと滑らかになるのかも。
1000個くらい点をリサージュ。アリいっぱい這ってるみたいできもすぎ…。
ポリゴン4枚で描画。
メモ。
dfobj1.zip
リハビリ。テクスチャに座標放り込んで正直にraymarching。48個程度。
ふええとグラボが音を上げ、使い物にならない。
テクスチャに描画して線形補完したのをplaneにあわせるのは今度。
元ネタ receptor by TBC
変態shaderなのが良く分かる。トークン結合でレイキャスト複製してるのが驚愕。
aobox.zip
新しい技術でも無いですが、基礎を抑えないと。
CreateVolumeTextureで作って、D3DXCreateTextureShaderで作ったのでperlin noise使ってD3DXFillTextureするという日本語とは思えない位の説明できなさ。
VolumeTextureは煙周りで最近流行ってるけど、もうちょっと前の技術も面白い。
TBCのreceptorなんかそんな感じ。tex3Dlodつかってるのがミソ。
F6で拾うノイズ線形補完する。
おまけ。
rca.zip
参考サイト
Static/Noise Color/Black&White Scanline Shaders
元ネタ menger fractal
ポリゴン4枚だけで描く変な世界。
menger2.zip
またレイキャスト。
地面作って柱立てて、四角でくり抜いていく感じ。
コンパイル時間尋常じゃない。
元ネタ distance functions
ポリゴン4枚だけで描く変な世界(使い回し)
df3.zip
平面上下 - 棒1 - 棒2 + fogみたいな感じ。
適当にidで色分けしてあげてdisplacementすると面白い。
リンク先のDomain Repetationと組み合わせて使うとSTGの背景くらいには使えそう。
Repeatする時、absかけて正負どちらにも触れれるようにしておく。
が、コンパイル時間すごいかかる + 重い。このままじゃ使えない。
あと調整で来てないのでモアレも酷い。キャスト精度も微妙なのでレイ突き抜けてしまうときがある。
ゆっくり見せないならOK(いいのかよ)
menger2.zip
元ネタ screen space ambient occlusion
ポリゴン4枚だけで描く変な世界。
有名過ぎて説明が。
かかり具合で4画面位に分けてます。
ssao_cast.zip(リンク先間違えてたので修正)
深度バッファの大きさ(ここではレイキャストした長さ)を集めてテクスチャに描画して、
描画するピクセルの周りを適当にとって比較して、描画しようとしているピクセルが
どれだけ周りに囲まれているのかを大体計算する。
メッシュ描画でも、z / wでVSからPSに流し込んであげれば深度バッファが補完込みで得られる。
テクスチャ座標とスクリーン座標、視点を意識しないとだめ系。
うっかり深度テクスチャ座標誤るとこんな感じに(0〜1が正しいのに、-1〜1にしちゃいましたの例)
nvidiaのPDFはこちら。
GDC08_Ambient_Occlusion.pdf
nvidiaのサンプルにあるとおり、本当はblurかけたりして画面になじませてあげないと、
エッジや前後関係が不自然になったりする。このプログラムもかなり不自然。
パラメータは見て良い物を選ぶ必要がありそう。
またリハビリ。
元ネタは Raymarching Beginners' Threadのlas氏の投稿。
noise_begginer.zip
ノイズ部分はわずか8行程度。
テクスチャに作らなくても適当に放り込むだけでお手軽にノイズあてられる。便利。
ただとても重い。
サンプルはレイの判定ちょっと甘い。工夫しないと。
自分用。音色確認。
エンベロープは慎重に作らないといけないらしいのでまだ未実装(実装できないだけ)
biyon1.zip
リハビリ。
元ネタは Ray tracing primitive.
torus.zip
元ネタは http://www.pouet.net/topic.php?which=6675&com=25&which=6675&com=25&page=10&x=37&y=10
karume.zip
karumedx11.zip : DX11テンプレ(自分用)
お手軽。意味はこれから理解する。
スクショ。上が適用している状態。すこし高級に見えるよね。
レイキャストでジャングルジムっすね。あと玉。
上下黒帯でフィルレート稼いでるのは秘密。
例によって2ポリゴンだけ。
JGIM.zip
以下スクショ
今週はアイソサーフェスで遊んだ。略してアイソさん。
プログラムはほとんど一緒でmain.fxがちょっとだけ違うだけ。
手ブレつけてるので酔うかもしれません。
ancient_machine.zip(Fly me to the moonを聴きながら。節操無く飛びます)
flash_machine.zip(フラッシュします)
seacave.zip(海の中っぽい)
umeboshi.zip(侵略してくる梅干し)
brazilian_nuts.zip(ブラジルナッツ)
aspara.zip(アスパラガス)
meetball.zip
meetball2.zip(低い解像度)
レイトレーシングとは名ばかり。反射もせぬマットなたこ焼きが舞います。
SM3.0じゃないと動かない。南無。