DXRの始め方(1)

最近、よく耳にするレイトレーシング

そんなレイトレーシングを簡単に?実装するためのAPI

DirectX12に付随(拡張)する形で現れたDirectXRaytracing(DXR)です。

DXRでできることの一つとして、反射、透過(屈折あり)処理を行うことができます。

f:id:ReU:20200923131847p:plainf:id:ReU:20200923131626p:plain 

 

 

 まずは、これぐらいの画像を出せるように頑張りましょう。

それより先(AO、GI)は、この処理をできてからでも遅くはないと思います。 

 

冒頭が長すぎると嫌われてしまうと、誰かに聞いたので

早速始めていきましょう。

 

DXRを始める際にまず行わなければいけないことは、

サンプルを見ることです。

材料(API)だけを渡されて作れる人がいるなら

そんな天才さんは、こんなブログ見なくてもできますからね。

サンプル置き場のURLを張っておきます。

github.com

 

ReadMeにも書いてありますように、

WindowsSDKのバージョンが1809以降にしておきましょう。

グラフィックボードもRTX20代以降ならなんでもいいです。

(GTXのやつは対応しているものもあったはず)

ドライバーは、 更新したくないという人以外は、最新にしておきましょう。

 

 サンプル1:CreateWindow

その名の通りウィンドウを作成しているだけなので

 無視してかまいません。

(サンプル全てが前のサンプルを拡張して書いてあるので全サンプルで見れます。)

 

サンプル2:InitDXR

ここからがDXRの始まりですね。

まずは、起動してみましょう。

ここでエラーのメッセージボックスが表示されるなら、環境が対応していないので

環境を整えてきましょう。

 

エラーメッセージが表示されないのを確認したら

ソースコードを見ていきましょう。

大して難しいことは行っていません。(DirectX12触った人)

 特別なことは.cppの84行目にあるDXRを起動するにあたって

対応しているかどうかをデバイスで確認をとってメッセージボックスを出している

だけです。↑の処理を行っているだけですね。

 

サンプル3: AccelerationStructure(AS)

知らない言葉が出てきましたね。

Acceleration:加速

Structure:構造

うーん🤔 加速する構造 なんぞやと

レイトレーシングを少しでも触ったことがある人はわかると思いますが。

レイトレーシングとはレイとオブジェクトとの交差判定を行い、

交差先の色を表示するものになっています。

つまり、レイとオブジェクトとの衝突検知を行うということになります。

ゲームをプレイするとわかると思いますが、

ゲーム中にはたくさんのオブジェクト(人や建物等)が画面上には存在します。

その一つ一つとレイとの交差判定をリアルタイムで総当たりで行うなど

愚の骨頂です。お天道様が許しても、筆者が許しません。(何様)

 そこで衝突検知でも使用されている

BoundingBoxHierarchy(BVH)を使用して高速化を図ろうという魂胆です。

レイと詳細な形状との衝突検知は、

その形状を包んだAABBと当たった後でいいじゃない

管轄外の物体との衝突検知なんてしなくていいじゃないということですね。

このBVHを構成するものをASと呼んでいると筆者は思っています。

(間違っていたらごめんなさい)

 

ソースコードに戻って、cppファイルの

282行目のcreateBottomLevelAS

325行目のcreateTopLevelAS

関数を見ていきましょう。

 ASはわかったとならでもその前に何かついてますね。

BottomLevel、とTopLevelですね。

BottomLevelは、メッシュ一つのことを表し

TopLevelは、BottomLevelを全て格納するものと思ってください。

SceneとGameObject(Actor)の関係性と思っても差し支えないかなと。

 

 

DXRは冒頭にも書いたようにDirectX12に付随するAPIです。

DirectX12をある程度把握していないとそもそもできないので

先に勉強しておきましょう。