漬物がうまい。

実はPocolは漬物に目がないのですが,昨日児島さんで買ってきた「赤みの樹」がかなり美味しかったので,後で,自分で漬物を作れるようにメモを残しておこうと思います。

(さらに…)

プログラマー飲み会!!冬の陣

春に引き続き,プログラマー飲み会!!を開催しようかなと思います。
興味ある人は下記のページから参加登録をお願い致します。
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を参考にしました。
RobustHardShadows_Fig_5_6

※図はMartin Stingl, 2011, Robust Hard Shadows. p.58より引用。

論文中で使われている下の画像ようなものを表示するためのものです。
LogPSM_Fig_5_32

※図は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に適用すると下記のようになります。
test_visualize
うちのサンプルで公開しているものは,それなりによさげに見えます。
Prallel-Split Shadow Mapの方にも適用してみました。
test_visualize2
PSSM適用するまでもないシーンなのですが,一応緑色が占める割合が多いので,適切にシャドウマップが適用されていることが分かりますね。
奥の方はこんだけちっこいシーンなので当たり前ですがオーバーサンプリング気味になっているので,カスケードの枚数を減らしても大丈夫そうな気がします。
再びUSMで2048×2048だったシャドウマップのサイズを256×256に落とすと下記のようになります。
test_visualize3
test_visualize4
奥の方は緑色になっているので確かにシャドウが適切に表示されていますね。
手前部分は赤から黄色に近い色になっているので,確かにちょっと汚いのが見て取れます。
こういう感じでデバッグに結構役立ちそうです。

もし実装間違え等があれば,正しい実装と一緒に指摘していただけると幸いです。

TortoiseGitでのリモートブランチの削除方法

TortoiseGitでのリモートブランチの削除方法をいつも忘れてしまうので,メモにしておきます。

①フォルダをクリックして,コンテキストメニューを表示して,「切り替え(W)」を選択。
git01
②ダイアログの「…」をクリックする。
git02
③左側のrefsからremotesを選択する。ブランチ名一覧から削除したいブランチを選択し,コンテキストメニューの「リモートブランチを削除」を選択する。
git03
これでリモートブランチが削除できるようです。

用語メモ

こんにちわ、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キャッシュ
* 冷蔵庫:L3キャッシュ
* スーパー:HDD
という例えもある。

キャッシュミス

キャッシュの中に必要なデータが無いこと。

命令セット

命令セットとは、あるマイクロプロセッサで使用できる命令の集合。
そのプロセッサを動かすための機械語コードの体系で、プロセッサに対してどのような命令が使用できるか、また、命令がどのような動作をするのかを定めたものだそうです。

コマンド

命令のこと。

コマンドバッファ

コマンドバッファとは,GPUが実行するコマンド列のバッファのこと。

mantle_software_instructure
図は,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!!

続いておすすめなのは,海外の大学の授業?でレンダラ―を書いて提出というものがあるのですかね。ツイッターで自分のタイムラインに乗ってきたものがあるので,いくつかご紹介します。

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現在ではこんな感じです。

息抜き。

ちまちまと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

マイクロソフトやりおる。