こんにちわ。
Pocolです。
不定期で漬物研究月報と題して,漬物を試した成果を記録して,考察しておいしい漬物を目指していきたいと思います。
カテゴリー: Other
どうでもいい話。
プログラマー飲み会!!冬の陣
春に引き続き,プログラマー飲み会!!を開催しようかなと思います。
興味ある人は下記のページから参加登録をお願い致します。
https://atnd.org/events/72705
あ、ちなみに教員の方とかプログラマーではない人でも大丈夫です。
興味ある人であればOKです!
開催日程はこれから調整しようと思いますが,12/19か20のいずれかを予定しています。
年末でも大丈夫な方が多ければ20日以降に開催しようかと思います。
参加登録の際に19・20・年末のいずれかをコメント記載していただけると助かります。
ちなみに参考として,前回の開催内容は下記のとおりです。
https://atnd.org/events/63383
エイリアシング誤差の可視化
※2015/10/04 やっぱりHLSLのコードが間違えていたようで修正しました。
LogPSMで出てきたエイリアシング誤差の可視化を実装してみました。
実装に当たっては,”Robust Hard Shadows”のAppendix A.3 Sampling rateと,博士論文でない方のLograthimic Perspective Shadowの論文中の式84, 式85を参考にしました。
論文中で使われている下の画像ようなものを表示するためのものです。
※図はLloyd, B. 2007. Logarithmic perspective shadow maps. PhD thesis, University of North Carolina. p.116 より引用。
float3 VisualizeError( float2 shadowCoord, float2 shadowMapSize ) { const float3 values[] = { float3( 0.0f, 1.0/7.75, 1.0f/7.75f ), float3( 1.0f/7.75f, 1.0f/3.25f, 1.0f/3.25f - 1.0f/7.75f ), float3( 1.0f/3.25f, 1.0f, 1.0f - 1.0f/3.25f ), float3( 1.0f, 3.25f, 2.25f ), float3( 3.25f, 7.75f, 4.5f ), float3( 7.75f, 10.0f, 7.75f ), }; const float3 colors[] = { float3( 0.2f, 0.0f, 0.0f ), float3( 1.0f, 0.2f, 0.0f ), float3( 1.0f, 1.0f, 0.0f ), float3( 0.0f, 1.0f, 0.0f ), float3( 0.3f, 0.8f, 1.0f ), float3( 0.0f, 0.0f, 1.0f ), float3( 0.0f, 0.0f, 0.2f ) }; float2 ds = shadowMapSize.x * ddx( shadowCoord ); float2 dt = shadowMapSize.y * ddy( shadowCoord ); float error = max( length( ds + dt ), length( ds - dt ) ); float3 result = (float3)1.0f; [unroll] for( int i=0; i<6; ++i ) { if ( error >= values[i].x && error < values[i].y ) { result = lerp( colors[i], colors[i+1], (error - values[i].x) / values[i].z ); break; } else { result = colors[6]; } } return result; }
Uniform Shadow Mapに適用すると下記のようになります。
うちのサンプルで公開しているものは,それなりによさげに見えます。
Prallel-Split Shadow Mapの方にも適用してみました。
PSSM適用するまでもないシーンなのですが,一応緑色が占める割合が多いので,適切にシャドウマップが適用されていることが分かりますね。
奥の方はこんだけちっこいシーンなので当たり前ですがオーバーサンプリング気味になっているので,カスケードの枚数を減らしても大丈夫そうな気がします。
再びUSMで2048×2048だったシャドウマップのサイズを256×256に落とすと下記のようになります。
奥の方は緑色になっているので確かにシャドウが適切に表示されていますね。
手前部分は赤から黄色に近い色になっているので,確かにちょっと汚いのが見て取れます。
こういう感じでデバッグに結構役立ちそうです。
もし実装間違え等があれば,正しい実装と一緒に指摘していただけると幸いです。
用語メモ
こんにちわ、Pocolです。
今回は用語についてメモを残しておこうと思います。
間違いが多々あると思いますので,間違いがあったらご指摘いただけると幸いです。
バス
バスとは、コンピュータ内部でデータや信号を伝達するための回路や通路のこと。
メモリバス幅
メモリがデータを一度に送れる量。
NVIDIA GeForce GTX 980 はメモリバス幅は256 bit
NVIDIA GeForce GTX 980 Ti は 384 bit
メモリ帯域幅
バス幅×周波数×1サイクル当たりの転送回数=帯域幅 …らしい。
NVIDIA GeForce GTX 980 はメモリ帯域幅が 224 GB/s
NVIDIA GeForce GTX 980 Ti は336.5 GB/s
VRAM
パソコン本体のメモリ(メインメモリ)と同じく、一時的にデータを保存する場所で、グラフィックカードについているメモリは「VRAM」と呼ばれるそうです。
キャッシュメモリ
処理装置と主記憶装置とのデータのやり取りを高速化するためのメモリーだそうです。
キャッシュメモリで調べると「CPUとの~」的な説明が多いですが,GPUにも搭載されています。
L1キャッシュ,L2キャッシュの例え話。
料理の方が速度的な違いはでるかも。キッチンがL1キャッシュ、冷蔵庫がL2キャッシュ、隣町のスーパーがHDD、そしてDVD/BDがHDDが農家って感じかな?
— ひげねこ@技 (@HigenekoTech) 2012, 11月 22
* キッチン:L1キャッシュ
* 台所:L2キャッシュ
* 冷蔵庫:L3キャッシュ
* スーパー:HDD
という例えもある。
キャッシュミス
キャッシュの中に必要なデータが無いこと。
命令セット
命令セットとは、あるマイクロプロセッサで使用できる命令の集合。
そのプロセッサを動かすための機械語コードの体系で、プロセッサに対してどのような命令が使用できるか、また、命令がどのような動作をするのかを定めたものだそうです。
コマンド
命令のこと。
コマンドバッファ
コマンドバッファとは,GPUが実行するコマンド列のバッファのこと。
図は,Matle Programing Guide p.13 より引用。
コマンドリスト
Microsoftのドキュメントによると(https://msdn.microsoft.com/ja-jp/library/ee422102(v=vs.85).aspx)
「コマンド リストは、記録と再生が可能な GPU コマンド シーケンスです。」
とのこと。
DMA転送
DMAはDirect Memory Accessの略。
CPUを介さずに「直接」メモリに転送すること。
DMA転送のメリットは,CPUの負荷を上げずにハードウェアの能力を利用した高速なデータ転送が実現できること。
ヒープ
メモリ関係で,ヒープといったらツリー構造ではなく,動的にメモリ確保可能なメモリ領域のことを指す。
ヒープ (heap) とは,「山積み」という言葉の中の「山」をさす英単語らしい。
フィルレート
1秒あたり何ピクセルの描画をすることが出来るかという能力値のこと。
スピンロック
マルチスレッドなどの環境の排他制御において、ロックを獲得するまでスピン(ビジーループ)で待つ方法
おすすめサンプル
この記事は,レイトレ合宿3!!!アドベントカレンダー第2回目の記事です。
本当は,VCMの解説をやろうかと思ったのですが,残念ながら論文を読んでいる時間がありません。
でも,レイトレ合宿はすぐやってくるわけでしてコードは書かなきゃいけないですよね~。
そんなわけで,今日はレイトレ合宿に向けてコードをガリガリと書くのに役立つサンプルを紹介するということにしたいと思います。
まずは,基本を押さえるという意味でholeさんのeduptは確認しておきましょう。
edupt
ありがたいことに,holeさんが解説をスライドで上げてくださっています。
皆さん感謝しましょう。
holeさんありがとう。
eduptを見終わって双方向パストレに興味がある人は,またまたholeさんがコードと解説スライドを上げてくださっています。
edubpt
皆さん感謝しましょう。
holeさんありがとう。
続いて,過去のレイトレ合宿の参加者のコードを読んでおくというのもおすすめです。
見ていない人は確認しておきましょう。
レイトレ合宿!
レイトレ合宿2!!
続いておすすめなのは,海外の大学の授業?でレンダラ―を書いて提出というものがあるのですかね。ツイッターで自分のタイムラインに乗ってきたものがあるので,いくつかご紹介します。
Bidirectional Path Tracer in CUDA. Student work by Paula Huelin Merino and Robert Cassidy. https://t.co/N0eVzRQwbd pic.twitter.com/KZ6zZARU3B
— Patrick Cozzi (@pjcozzi) 2014, 12月 8
CUDA path tracer with motion blur, AA, depth of field, and texture mapping by Bo Zhang. https://t.co/F7oTHSwBw6 pic.twitter.com/h3qv45FAF9
— Patrick Cozzi (@pjcozzi) 2014, 11月 3
CUDA path tracer with AA, depth of field, motion blur, and texture mapping by Wei-Chien Tu. https://t.co/32EwBtGQJ0 pic.twitter.com/bzxpVtRsF9
— Patrick Cozzi (@pjcozzi) 2014, 11月 3
New Spectral Stochastic Progressive Photon Mapping with Single-Wavelength Photons leads to 5x reduction in memory. pic.twitter.com/8o3XYl0oXn
— appleseedhq (@appleseedhq) 2014, 9月 26
なにこれ凄い… 優秀すぎる… > Image Synthesis 2014: Rendering Competition Results https://t.co/p9n1p7cV96
— Syoyo Fujita (@syoyo) 2014, 12月 19
https://graphics.ethz.ch/teaching/imsynth14/competition//1st%20Place..%20Benedikt%20Bitterli/report.html
https://graphics.ethz.ch/teaching/imsynth14/competition//2nd%20Place..%20Simon%20Kallweit/report.html
https://graphics.ethz.ch/teaching/imsynth14/competition//Beat%20Kueng/report/index.html
他にもいくつかあるので,この記事を随時更新していこうかなぁと思います。
とりあえず2015/06/02 11:00現在ではこんな感じです。
GDC Vulkanセッション
GDCのVulkanのセッションの動画がGDC Valutにてアップロードされいるようです。
http://www.gdcvault.com/play/1022018/
ちなみにこのセッションを自分は会場の真ん中あたりで生で聞いていました。
息抜き。
ちまちまとLogPSM訳してはいるんですが,ちょっと飽きてきました。
そんなわけで,息抜きとしてプログラム書こうかなと思いました。
いつもはグラフィックス系のプログラムばっかり書いているので,
たまにはちょっとゲーム寄りのプログラムも書いてみたいなぁーと思い立ったが吉日。
早速書いてみました。
最近知り合いの方とボードゲームをやる機会があるのですが,そのボードゲーム教育向けにはすごく良いのですが,ゲームとしてはかなりツマラナイ。
ちょっと手を加えてやれば面白くなりそうなのに残念だなぁーと思っていたのですが,「そうだ!自分でつくればいいんじゃね?」と安直に思い立ちました。
そういうわけで,すごろくゲームをつくってみようかなーと思います。
すごろくゲームの肝といえば,やっぱりサイコロ。
よっしゃ!作るか! …と思い立ちましてサイコロシミュレータ作ってみました。
サイコロを振るプログラム自体は (乱数 % 6) + 1 で速攻で実装が終わるのですが,アニメーションどうしようかな?と詰まりました。
まず困ったのがどうやってサイコロ回転させるということです。
適当に回転させると目が偏るし,縦回転だったやつが急に横回転になるのも何か変な感じするしなぁーと悩む。
HavokとかPhysXとか使ってガチでシミュレーションさせるのもいいんですが,今度は終了条件決めるの面倒じゃね?と悩む。
結局わからないので,桃鉄参考にすればいいんじゃん!と思い,土日でひたすら桃鉄のサイコロを研究・考察して作成したのが,動画のサイコロシミュレータです。
まだ1個しかサイコロ振れませんが,なんとかしてサイコロ5個までは対応したい & 音つけたいです!!
ちなみにサイコロの軌跡は完全に手付けです。そのため,位置決めが結構面倒くさい。だから2個とか3個とかサクッとつくれていないんですよねぇ~。
正射影で計算して45度回転させるのも手かなぁ~なんて思ったのですが,結局実装のコストとか考えて手付けアニメーションにしました。
とりあえず今は普通のサイコロのテクスチャ使っているのですが,「これサイコロのテクスチャ変えれば,”ごきげんよう”できるんじゃね」とか色々と面白いことに使えそうな気がします。
あと,乱数は0 ~ uint32_tの最大値 だと,偏りが出来て各目の確率がぴったり 1/6 にならないので,乱数が6の倍数になるようにきちんと生成範囲は調整を加えています。
※追記
サイコロ5つまで対応してみました!!
あと,折角なのでGithubでソースコードを公開しました。
下記からダウンロードできます。
https://github.com/ProjectAsura/dice
マイクロソフトやりおる。
Visual Studio Community 2013が発表されました。
・大学関係者
・非営利団体従事者
・オープン ソース開発者
・開発者 5 名以下の中小企業
であれば,Visual Studio Communityを使って開発することができるそうです。
詳細は下記を参照。
http://www.microsoft.com/ja-jp/dev/products/community.aspx
次のニュースVisual Studio 2015 Previewが公開されたようです。
http://blogs.msdn.com/b/dotnet/archive/2014/11/12/announcing-net-2015-preview-a-new-era-for-net.aspx
http://www.visualstudio.com/news/vs2015-preview-vs
さらに次のニュース、これが一番驚きなんですが
.NET Core Rutimeおよび.NET Frameworkのオープンソース化が発表されました。
http://news.microsoft.com/2014/11/12/microsoft-takes-net-open-source-and-cross-platform-adds-new-development-capabilities-with-visual-studio-2015-net-2015-and-visual-studio-online/
Github上で公開されているようで,下記のページらしいです。
https://github.com/Microsoft/dotnet
マイクロソフトやりおる。