Yakiimo3D

Mostly DirectX 11 Programming

Archive for the ‘Demo’ Category

DirectX11 Interop CUDA Mandelbrot Fractal

はじめに 以前作ったDirectCompute Mandelbrot fractal demoをCUDAを使用して描画できるように拡張しました。簡単なMandelbrot fractal rendererですが、CUDAとDirectComputeの使用を動的に切り替えることが可能です。 関連リンク集 http://developer.download.nvidia.com/compute/cuda/sdk/website/Graphics_Interop.html#simpleD3D11Texture NVIDIA CUDA 3.2 SDKのDirectX11 interopサンプルの「Simple D3D11 Texture」を参考に実装しました。3.2 SDKだとD3D11を使用しているサンプルはこの「Simple D3D11 Texture」だけみたいです。「Simple D3D11 Texture」サンプルはID3D11Texture3DをCUDA resourceとして使用していますが、今回のMandelbrot fractalプログラムはID3D11BufferをCUDA resourceとして使用しています。 http://developer.nvidia.com/object/cuda-by-example.html 主にCUDA 3.2 SDKのprogramming manualを参考にCUDAを勉強しましたが、NVIDIAの「Cuda by Example」本もSafari Informitでオンラインで読みました。本自体がとても読みやすくて、数時間で読めました。CUDAを分かりやすく噛み砕いて説明してくれる良書で、入門書としてはいいかなと思いました。 http://www.yakiimo3d.com/ja/2010/02/02/directcompute-mandelbrot-fractal-viewer-2/ 元のDirectCompute Mandelbrot fractal viewerのYakiimo3D記事です。なんとプログラムに、画面サイズがthread group sizeで割り切れない場合、表示が少しおかしくなる恥ずかしいバグが見つかりました(oh no!)。今回のCUDA interopデモではバグを修正しておきました。 実装の詳細 CUDA DirectX11 interopとDirectComputeのパフォーマンスを計測してみました。環境はGeforce GTX 460, Driver 266.58, Vista 64-bit SP2、CUDA SDK 3.2です。CUDA、DirectCompute共に最適化は行っていません。CUDAの方がドキュメント、ツールが充実しており、プログラムをより細かく調整できそうなので、最適化はやりやすい気がします。 Num [...]

[Continuar Lendo →]

DX11 Temporal AA Without Manual Blending

はじめに 前回リリースしたTemporal AAデモに手動ブレンドを行わないTemporal AAの実装を追加しました。海外の技術系3Dフォーラムを読んでいるとTemporal AAだからスクリーンショットだとアンチの効果が見えないよというコメントを見かけますが、前回の自分のリリースしたjitterしたフレームを自分でブレンドする実装だとTemporal AAの効果はscreenshotに普通にでます。ただし、自分でAA用のblendingを行わない実装も可能ですし、その場合はTemporal AAの効果がスクリーンショットでは確認できないです。今回は自分でAA用blendを行わないタイプのTemporal AAを実装してみました。 プログラムのソースとバイナリがDLできるCodePlexリンクは記事の最後の方に貼っています。 関連リンク集 1) http://en.wikipedia.org/wiki/Radeon_R420 Radeon X700-X850 シリーズでは今回の手動blendを行わないTemporal AAが実装されていたみたいです。自分のHD5750とCatalyst 10.10ではオプションが表示されないので、最近は機能として用意されていないみたいです。 2) http://techreport.com/articles.x/6672/22 Tech Reportの記事にRadeonでのTemporal AA実装に関する情報がのっています。違うマルチサンプル・パターンを交互に利用する実装のようですが、vsyncが有効で60fpsでアプリが動作する場合は、手動でblendingを行わなくても、脳が自動的にフレーム間の補間を行ってくれ、実際のサンプル数より高品質なAAに見えるらしい。Temporal AAを使用した2x MSAAは4x AAと同等な品質に見えるらしいです。 3) http://forum.beyond3d.com/showthread.php?t=46241 Beyond3Dの”List of Rendering Resolutions + basics on hardware scaling, MSAA, framebuffers”スレでは手動blendingを行う実装と、行わない実装の両方が話題として取り上げられています。 4) http://www.yakiimo3d.com/ja/2010/09/29/dx11-perspective-matrix-jittering-temporal-aa-2/ 前回の手動でBlendingを行う自分のTemporal AA実装です。Reprojectionは行わない簡単な実装なので、ghosting/blurringが出ちゃいます。 実装の詳細 jitteringに関してなど実装の詳細は前回のTemporal AA実装から基本的に変わってないです。前回と違う点は、AA用の前フレームとのblendingを自分では行わずに、ユーザーの目、脳による自動的な補間に任せている所です。今回の実装からvsyncの設定を変更できるcomboboxを追加しましたが、vsync-onの60fps以外の、vsync-offの60+fps、vsync-onの30fps、vsync-onの20fpsは全部、シーンのチラツキがひどいので、vsync-onで安定した60fpsが今回の手法にとっては必須みたいです。前回の手動でblendingを行う場合はblurring/ghostingが問題となり、今回の手動で行わない場合は画面のチラツキが問題となるみたいです。 Radeonでの実装とは違い、MSAAパターンではなく、jitterされたシーンを交互に描画しているので、品質的には前回のTemporal AAと同じく、2x SSAAと同等なはずです。実際リリースしたデモでは今回のTemporal AAはsub-pixel offsetを0.25から0.15に弱めたので、前回のTemporal AAと比較して、若干AAのきき具合が弱くなっています。自分の単純な実装だとvsync-onの60fpsでも時々画面のチラツキが気になるので、offsetを小さくしました。 デモ Source Code & [...]

[Continuar Lendo →]

DX11 Perspective Matrix Jittering Temporal AA

はじめに Temporal AAアルゴリズムは前フレームに描画された情報をサンプルとして利用する、時間方向でのスーパーサンプリング・アンチエイリアス・アルゴリズムです。Temporal AAの実装方法自体は幾つかあるみたいですが、前フレームと現在フレームの透視投影変換行列をジッタさせ、ブレンドして表示するという単純なアルゴリズムを自分は実装しました。この種類のTemporal AAはBeyond3Dのフォーラムでも話題になっています(http://forum.beyond3d.com/showthread.php?t=46241)。 Nao_uさんもTemporal AAを実装されています。http://game.g.hatena.ne.jp/Nao_u/20100924でNao_uさんのTemporal AA実装のスクリーンキャプチャーや冷静で的確な考察が読めます。 いつものようにプログラムのバイナリとソースが置かれているCodePlexページへのリンクを記事の最後の方に貼っています。 Halo: Reach Temporal AA http://www.eurogamer.net/articles/digitalfoundry-halo-reach-tech-analysis-article (AAはページ3で取り上げられています。) Digital Foundryが最近Halo: ReachをTech Analysisで取り上げました。いつもように自社がメディアや開発者に販売している機材を利用して、Halo: Reachを解析していますが、ゲーム内でのアンチエイリアスの特性から、Halo: Reachでのアンチエイリアスは何らかのTemporal AAだと話題にされています。 http://d.hatena.ne.jp/yakiimo02/20100920/1284950755 Digital Foundryの記事に関する自分の日記です http://d.hatena.ne.jp/yakiimo02/20100923/1285230579 Halo: Reachを実際に購入してプレイした自分のアンチエイリアスに対する感想です。 CryEngine3 Temporal AA http://advances.realtimerendering.com/s2010/index.html Siggraph 2010の「Advances in Real-Time Rendering in 3D Graphics and Games」コースの「CryENGINE 3: Reaching the Speed of Light」でCryEngine3でのAA実装についての紹介がありました。CryEngine3では手前の物体と遠方の物体に別々のAAアルゴリズムが適用されるハイブリッドな手法を採用しているそうです。手前の物体に関してはEdge検出ベースのポストプロセスAAが適用され、遠方の物体に関してはTemporal AA(the temporal reprojection with cache miss手法)が適用されるそうです。 Crytekの公開資料でtemporal [...]

[Continuar Lendo →]

DX11 Order Independent Transparency with MSAA

はじめに 前回のDX11 OIT デモ(http://www.yakiimo3d.com/2010/07/19/dx11-order-independent-transparency/)を拡張して、MSAAに対応させました。 プログラムのソースとバイナリがDLできるCodePlexリンクは記事の最後の方に貼っています。 関連リンク集 1) http://www.yakiimo3d.com/2010/07/19/dx11-order-independent-transparency/ 自分の元DX11 OITデモの記事です。 元デモはMSAA無しなので(オンにしたら本当なら表示がバグるだけのはずだけど、必要がないのにswapchainのbufferをDXGI_USAGE_UNORDERED_ACCESSフラグを立てて生成しているので、swapchain生成で落ちてしまいます)、色付Quadのedgeのジャギーが結構目立っています。 2) http://developer.amd.com/documentation/presentations/Pages/default.aspx ATIのプレゼンリンク集ページから”GDC 2010: OIT and GI using DX11 linked lists”のプレゼン・パワポがDLできます。プレゼンでは、アルゴリズムのMSAAへの対応方法も記述されていたので、前回と同じく今回のデモもこのプレゼンを参考に実装しています。 デモ・スクリーンショット 上から順番にMSAA none、 MSAA 2x、 MSAA 4x、 MSAA 8xです。none、2x、4x、間では大きな改善が確認できますが、4xと8xの違いはあんまり分からないです 個人的には4x辺りからedgeのジャギーが気にならなくなります。サンプリング数を増やすと処理負荷が増え、fpsがどんどん落ちます。 実装の詳細 元デモからそんなに沢山の変更無しでMSAA対応を実装できました。主な変更点はSV_COVERAGEとSV_SAMPLEINDEX semantic parameterをpixel shaderの入力構造体へ追加して利用した事です。 StoreFragments.hlslへの変更点 struct ScenePS_Input {     float4 pos               : SV_POSITION;   [...]

[Continuar Lendo →]

DX11 Order Independent Transparency

はじめに ATI DX11 linked list OITアルゴリズムを自分も実装してみました。DirectX11 SDKのOITサンプルはCompute Shaderのサンプル的なもので実行速度が遅いですが、ATIのOITアルゴリズムは速いよと聞いていたので(実際結構速いです)、実装してみました。もうすでに何人もの方々がDX11 linked list OITの実装を公開していますが、参考にしながら自分の実装を行ないました。 プログラムのソースとバイナリがDLできるCodeplexリンクは記事の最後の方に貼っています。 関連リンク集 1) http://developer.amd.com/documentation/presentations/Pages/default.aspx ATIのプレゼンリンク集ページから”GDC 2010: OIT and GI using DX11 linked lists”のプレゼン・パワポがDLできます。今回のデモはこのプレゼンのアルゴリズムを実装しています。 2) http://www4.atword.jp/cathy39/category/direct3d11/oit-direct3d11/ 日本人GPU Pro投稿者のKaori Kubotaさんのlinked list OIT実装です。ソースコードを文中に用いた、丁寧で分かりやすい説明です。D3D11_BUFFER_UAV_FLAG_COUNTERとかサンプルで利用されていないDX11の機能の参考になりました。自分の今回の実装はATIのプレゼン資料とKubotaさんのblog記事を元に実装しています。 3) http://orenk2k.blogspot.com/2010/03/oit-order-independent-transparency.html Linked list OIT実装についてのblog記事です。分かりやすい説明です。 4) http://sites.google.com/site/monshonosuana/directxno-hanashi-1/directx-110 Monshoさんのlinked list OIT実装です。分かりやすい説明で、ソースコード、バイナリがDLできます。 5) http://www.uraldev.ru/articles/id/36 Linked list OIT実装についてのblog記事です。記事がロシア語なので、google translateを利用して読みました。個人ブログではなく、開発者サイトへの投稿記事みたいなので、気合が入って書かれています。ソースコードとバイナリがDLできます。 http://www.wolfgang-engel.info/blogs/?p=116のコメント欄に作者がリンクが張っているので知りました。 6) http://joescg.blogspot.com/2010/01/oita-buffer-demo.html もう一個ロシア語blog記事のOIT実装です。google translateをまた利用しました。http://www.geeks3d.com/forums/index.php/topic,861.0.htmlを読んで知りました。 7) http://www.yakiimo3d.com/2010/06/19/dx11-high-quality-global-illumination-rendering-using-rasterization/ 今回のDX11 [...]

[Continuar Lendo →]