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 linked list手法はOIT以外にも利用方法があるみたいです。Toshiya Hachisukaさんの “High-Quality Global Illumination Rendering Using Rasterization”アルゴリズムとかも今回のATI StructuredBuffer linked list手法で高速化できるみたいです。
デモ・スクリーンショット

ID3D11BlendStateを利用した普通のalpha blendingの描画結果です。青色のポリゴンが間違って赤色のポリゴンの手前に描画されています。各色付ポリゴンはひとつのドロー・コールで描画されているので、ポリゴンをソートして正しいalpha blending結果にすることも無理です。

DX11 OITを利用した描画結果です。pixel単位にfragmentがソートされるので、正しく描画されています。
実装の詳細
参考にできる文章が他にも沢山あるので、linked list OITアルゴリズムの説明は書かないです。自分のATI HD5750だと、DirectX SDK OITサンプルが320×240の画面サイズで10 fpsぐらいでしたが、今回のATI OITの実装は640×480の画面サイズで700 fpsぐらいでました。普通のID3D11BlendStateを利用したalpha blendingだと画面サイズ640×480で3000 fpsぐらいでます。
OITデモ
Source Code & Binary
http://yakiimo3d.codeplex.com/releases/view/49213
コメント
最後にデモを公開して3ヶ月以上間隔があいてしまった。先月は少し落ち込んでいたけど、大分回復したので、もう少し実装頑張りたいです。次は今回のOITデモをベースとした半透明マテリアルの実装とか、DX11 tesselation機能を利用したDX11 Phong Tesselationデモとかを考えています。
. This entry was posted on Monday, July 19th, 2010 at 2:46 PM and is filed under Demo, DirectX11. You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site.
Leave a Reply
XHTML: You can use these tags:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>It may take some time for your comment to appear, it is not necessary to submit it again.