Yakiimo3D

Mostly DirectX 11 Programming

Archive for the ‘Demo’ Category

DX11 DirectCompute Buddhabrot & Nebulabrot Renderer

はじめに BuddhabrotフラクタルのDX11 DirectCompute版を実装してみました。以前実装したDX11 DirectCompute版Mandelbrotフラクタルの実装をベースにプログラムを組みました(http://www.yakiimo3d.com/ja/2010/02/02/directcompute-mandelbrot-fractal-viewer-2/)。 また前回実装したRheinhardトーンマップ(http://www.yakiimo3d.com/ja/2010/03/16/dx11-directcompute-global-operator-photographic-tonemapping-2/)を利用してHDR値のBuddhabrot iteration count bufferをframebufferのLDR、[0,1]範囲にマップしました。以前実装したソースを今回利用していて、トーンマップのコードにバグがある事、DX11 MandelbrotデモのソースとバイナリをCodePlexにアップし忘れていることに気がつけて良かったです。(; ̄ー ̄A アセアセ・・・ 通常のBuddhabrot描画だとRGBの3色に同じ値が書き込まれるため、彩度のないモノトーンカラーの絵になります。Buddhabrotに対する単純な拡張であるNebulabrotでは、Buddhabrotの軌道プロットを違う反復上限値を使い3回行い(実際の実装では、分岐を使う事で描画は1回ですませます)、それぞれの軌道プロット結果を一つのRGBチャンネルに書きこみます。Nebulabrotは実装が簡単で、描画結果の見栄えもよくなるので、今回のBuddhabrot実装ではNebulabrot描画にも対応しています。 いつものようにソースとバイナリへのCodePlexリンクを記事の最後の方にはっています。 関連リンク集 1) http://www.superliminal.com/fractals/bbrot/bbrot.htm Buddhabrotの発見者のMelinda Greenさんによる解説ページです。BuddhabrotとNebulabrotの分かりやすい説明が読めます。またページの一番下の方に、他の人によるBuddhabrot実装リンク集が用意されています。Buddhabrotの情報を色々調べているうちにMelinda Greenさんのstackoverflow.comプロファイルを発見しました(http://stackoverflow.com/users/181535/melinda-green)。stackoverflowに投稿するような現役の開発者がアルゴリズムの発見者だという事は少し面白いなと思いました。 2) http://local.wasp.uwa.edu.au/~pbourke/fractals/buddhabrot/ Paul Bourkeさんのページには数学的なアルゴリズムや幾何学的なアルゴリズムの良い説明が沢山あり、よくお世話になっています。Buddhabrotに関するページには分かりやすい説明と実際の実装のソースコードが置かれています。 3) http://iquilezles.org/www/articles/budhabrot/budhabrot.htm 綺麗なNebulabrotのレンダー画像が見れます。このページの説明を読んで、Buddhabrot出力結果を2乗、3乗する事でコントラストが高い、より綺麗な描画結果が作れることに気がつきました。 4) http://brnz.org/hbr/?p=297 ソースコード付きのPS3 SPU版 Buddhabrot実装です。作者の人をtwitter(http://twitter.com/twoscomplement)でフォローしていますが、自分がBuddhabrotを知った頃にPS3版のデモを見たので、印象に残っています。 5) http://www.steckles.com/buddha/ Buddhabrotアルゴリズムの基本的な考えはランダムサンプリングを毎フレーム繰り返すという意味でパストレに似ています。このページの作者はパストレでも使われることがあるMetropolis-Hastingsアルゴリズムを利用して、Buddhabrotレンダーの収束を統計学的に高速化する事を提案しています。いいアイデアだと思うし、将来元気があれば、実装してみたいです。 6) http://en.wikipedia.org/wiki/Buddhabrot BuddhabrotのWikipediaページにも有益な情報とリンクが沢山書かれています。 Buddhabrotデモの動画 YouTubeにBuddhabrotデモの実行動画を投稿しました。デモのBuddhabrotは最大反復上限値が赤:10,000 緑:1,000 青:100のNebulabrotです。(自分のプログラムのデフォルト値です。) Buddhabrotデモの静止画像 プログラム実行開始20分後ぐらいにスクリーンショットをとりました。レンダー中は平均で42fpsぐらいのフレームレートが出てましたが、毎フレーム10,000サンプルをサンプリングするので、毎秒420,000サンプルのサンプリング速度で画像は描画されました。画像をクリックすれば1592×1028の解像度でみれます。Nebulabrotの反復上限値は動画と同じデフォルトの物を使用しています。tonemapのmiddle-grey値は違う値かもしれないです。 実装の詳細 Compute Shader Thread Setup Dispatch関数をthread group次元 (合計10×10=100 thread groups)でよんでいます。hlsl内ではnumthreadを(10,10,1)次元で定義しているので、各thread groupはそれぞれ100個のthreadを所有しています。 100個のthread groupそれぞれが100個threadを所有するので、合計10,000のthreadが毎フレーム並行にcompute [...]

[Continuar Lendo →]

DX11 DirectCompute Global Operator Photographic Tonemapping

はじめに Erik Reinhard, Mike Stark, Peter ShirleyとJim Ferwerda著の論文がベースの、ゲーム開発者の中では恐らく一番有名なトーンマップ・アルゴリズムのDX11 DirectCompute版を実装しました。作者によってhttp://www.cs.utah.edu/~reinhard/cdrom/で提供されているソースコードを元に実装しました。ソースコードではYxy空間の輝度値に対してトーンマップが実行されていますが、自分の実装も同じようにしました。実装のDirectCompute部分はDirectX SDKのHDRToneMappingCS11をベースに利用しました。 関連リンク集 1) http://www.cs.utah.edu/~reinhard/cdrom/ 作者のEric Rheinhardのトーンマップアルゴリズム説明ページです。ホームページには”Photographic Tone Reproduction for Digital Images”論文のpdf、サンプルソースコード、.hdr形式のサンプルHDR画像が置かれています。 2) http://wiki.gamedev.net/index.php/D3DBook:High-Dynamic_Range_Rendering gamedev.netの無料DirectX10プログラミング本”Programming Vertex, Geometry, and Pixel ShadersのHDR renderingに関する章にRheinhard tonemappingの説明と実装が載っています。説明は元Rockstar Gamesのgraphics programmerでGPU Pro (出版社が変わる前はShaderX)の編集長のWolfgang Engelさん(http://diaryofagraphicsprogrammer.blogspot.com/)によって執筆されていますが、内容が凄くいいです。 3) http://www.gamedev.net/community/forums/topic.asp?topic_id=407348 gamedev.netフォーラムのRheinhard tonemapping実装に関するスレです。 4) http://www.t-pot.com/program/123_ToneMapping/index.html t-pot.comのDX9で実装されたRheinhard global tonemapping operatorです。Tonemap計算はYCrCb色空間で輝度値に対して行われています。 デモ画像 HDR Cornell Box Comments 左のHDR画像がtonemap無しのCornell boxレンダー画像です。右の画像は同じ画像のtonemap有り画像です。tonemap無しの場合は、1以上のHDR情報が失われてしまい、画像が白飛びしてしまっています。トーンマップが有効な場合、 HDR画像がLDRの範囲にスケールされるので、画像の明るい部分が白飛びせず、画像の色がちゃっんと見えます。 LDR Cornell [...]

[Continuar Lendo →]

DirectCompute Mandelbrot Fractal Viewer

はじめに インターネットで色んな人がもうすでに実装していますが、GPGPU言語を使ったマンデルブロ集合フラクタル・ビューワーを自分も実装してみました。DirectComputeの実装と同時にCPU版も実装したけど、DirectCompute版の方が平均的に50倍以上高速で、少しだけ感動です。ただし、CPU版の実装はまだまだ高速化の余地があるので(GPU版も高速化できてないですが、CPU版の方が速くなりそう)、実際の性能差はもう少し小さいと思います。 他の人のGPGPU言語Mandelbrot Fractal実装 この数カ月間で何人かのプログラマがGPGPU言語 Mandelbrot fractalの実装を公開しています。GPGPU言語勉強の初期課題として人気が高いみたいです。 1) DX11 DirectCompute Mandelbrot and Julia viewer http://users.skynet.be/fquake/ Beyond3Dのフォーラムを読んで去年知りました。(http://forum.beyond3d.com/showthread.php?t=55330)。作者の人はDirectComputeデモをMandelbrot viewer以外にもリリースしていますが、最近リリースされた流体のデモはかなり凄いです。デモのzipにソースコードも同梱されています。 自分の日記の関連リンク http://d.hatena.ne.jp/yakiimo02/20091228/1262004553 2) A realtime Mandelbrot zoomer in SSE assembly and CUDA http://users.softlab.ece.ntua.gr/~ttsiod/mandelSSE.html VizWorldの記事を読んで知りました。(http://www.vizworld.com/2009/12/realtime-mandelbrot-zoomer-sse-assembly-cuda/)。Nvidia Cudaを利用した実装以外にも手動でSIMD高速化されたマルチスレッド対応のCPU版も実装されています。GPLでソースも公開されています。 自分の日記の関連リンク http://d.hatena.ne.jp/yakiimo02/20091217/1261055234 3) MandelCPU vs MandelGPU http://davibu.interfree.it/opencl/mandelgpu/mandelGPU.html LuxRenderのOpenCL対応を中心的に進めているプログラマの人みたいです。 (http://www.luxrender.net/wiki/index.php?title=Luxrender_and_OpenCL)。デモではCPU版とOpenCL版のMandelbrot fractal viewerが実装されています。 作者のHPhttp://davibu.interfree.it/index.htmlにはソース付きで他にも色々OpenCLのデモが公開されています。 自分の日記の関連リンク http://d.hatena.ne.jp/yakiimo02/20100117/1263720072 http://d.hatena.ne.jp/yakiimo02/20100106/1262787003 http://d.hatena.ne.jp/yakiimo02/20091222/1261500968 Mandelbrot Fractalの説明 http://warp.povusers.org/Mandelbrot/ 上記ページがとても分かりやすかったです。Mandelbrot fractalは初実装ですが、上記ページを参考にしながら実装しました。 Mandelbrot Fractal [...]

[Continuar Lendo →]

CPU版Bitonic Sort

はじめに DirectX 11勉強の第一段として、CPU版Bitonic Sortを実装してみました。Bitonic Sortは並列化にむいているアルゴリズムらしいですが、DirectX 11 Direct ComputeとNvidia Cudaのサンプル実装が公開されています。 1) Nvidia Cuda SDK sample http://developer.download.nvidia.com/compute/cuda/sdk/website/samples.html#bitonic 2) DirectX SDK DX11 Direct Compute sample http://msdn.microsoft.com/en-us/library/ee416561%28VS.85%29.aspx 自分のbitonic sortデモのバイナリとソースコードは記事の最後の方に置いています。 Bitonic Sort Demoの動画 DirectX11ハードがない人用にbitonic sortデモの動画をyoutubeにアップしました。 ランダム化されたunsigned longをメンバーとして持つStructuredBufferが昇順にソートされ、同じデータがその後、降順にソートされます。再帰版も実装されていますが、動画のデモではloop版のbitonic sortが利用されています。 Bitonic Sort情報サイト もうすでにネットにはbitonic sortに関する情報を教えてくれる、いいサイトが複数あります。下のサイトは特にお薦めです。 1. http://www.t-pot.com/program/90_BitonicSort/index.html t-potのbitonic sortサンプルです。サンプルではpixel shaderを利用してbitonic sortが実装されています。bitonic sortアルゴリズムの説明が図解付きで分かりやすいです。 2. http://www.iti.fh-flensburg.de/lang/algorithmen/sortieren/bitonic/bitonicen.htm t-potでも紹介されていますが、bitonic sortアルゴリズムを詳しく説明しています。 3. http://www.tools-of-computing.com/tc/CS/Sorts/bitonic_sort.htm 自分のデモはこのサイトの説明とサンプルコードをベースに実装しました。再帰版とループ版のbitonic sortが分かりやすく、丁寧に説明されています。DirectX SDKの DX11 compute [...]

[Continuar Lendo →]