RAY TRACING GURU

THE WAY TO GO IN THE FUTURE

リアルタイムレイトレーシングの完全な解説

レイトレーシングを理解せずにDXRを始めようとする事は、例えるなら「野球のルールを知らない人が野球ゲームを作ろうとしている」のと同じです。当然すぐに壁にぶち当たります。

いきなりDXRは現実的ではありません。

DXRにおいてポリゴン1枚をレンダリングするためには、プログラマーがレイを発射してレイとポリゴンの交差判定コードを書く必要があります。それだけではなくモデルのデータ構造を理解していることが暗に求められます。高速化の必要性や方法を理解している(できれば自分で実装できる)とDXRの内部が見えてきます。

本書はそれらを全て解説します。

レイトレーシングそのものから解説

いきなりDXRを勉強するのは現実的ではないため、まずはCPUだけで制作したレイトレーシングを学んでいきます。「CPUだけ」の意味はDXRを一切使わず、DX12すらも使わずにC++コードだけでレイトレーシングをするという意味です。レンダリング結果の描画には簡単なWin32 APIを使います。

 

C++Win32 APIで書かれたコードは理解のし易さはこれ以上ないといってもいいくらい簡単です。レイトレーシングの理論そのものの理解に頭を使ってほしいため、コードのほうは究極的に分かり易くしたつもりです。

マテリアルも解説

マテリアルによりポリゴン自身に色を持たせます。マテリアルとは、色や光沢、テクスチャーなど、ポリゴン表面の”材質感”を表現する概念で、ポリゴンに関連付けます。

数十万ポリゴンを60FPSで

球やボックスなどのプロシージャルモデルだけではなく、数十万ポリゴンから成る

ポリゴンメッシュを60FPS以上でレンダリング可能です。

このページの画像及びビデオは全て実際の本書サンプルによる実行結果をキャプチャしたものです。

(ご注意)DXR編においては、読者にDirectX12を運用できる事が求められますのでご購入にはご注意ください。

本文「はじめに」

現在のリアルタイムグラフィックスのレンダリング方式として支配的なのはラスタライズ方式(ラスタライゼイション)です。この方式は今から半世紀前グラフィックスの黎明期からあるパラダイムであり、その高速性から初期のGPUから現在に至ってもまだ多くのGPUで広く使用されています。

一方、レイトレーシングはその膨大な計算量がネックとなりリアルタイムで行うものではないというのが長年の常識であり、当然レイトレーシングに対応するGPUなどは存在しませんでした。

しかし、近年のGPU能力の飛躍的進化はGPU上でリアルタイムにレイトレーシングを行うことを可能にしました。2018年にマイクロソフトからリリースされたDXRを使うことにより、ひと昔前までは夢物語であったリアルタイムレイトレーシングが可能になります。

2018以前でも2010年くらいのハイエンドGPUであれば、GPGPU機能を使えばリアルタイムレイトレーシングを独自に実装することは可能ではありましたが、API側で統一的にレイトレーシングに対応したという事には計り知れないメリットがあります。当然GPU側もこれからどんどんハードとしてレイトレーシングに対応していくでしょう。

 

今、ラスタライゼイションからレイトレーシングへのパラダイムシフトが起きているのです。

 

ラスタライズ方式は廉価なGPUで今後も残るでしょうが、それ以外のレンジで一旦レイトレースに置き換わったら今度はそれが新しい基盤パラダイムになるかと思います。そしてそれはかなり長く続くのではないかと筆者は思っています。そうなるとリアルタイムグラフィックスに携わる人にとってレイトレーシングを学ぶ事はもはや必須とも言えるものになるかもしれません。

なお、誤解の無いように書き添えておきますが、ラスタライズ方式つまり現状のパイプラインを学ぶことは今後数十年先においても重要だと思います。

 

さて、本書ではまずCPU編でレイトレース自体をマスターすることを目指します。これは必須になります。DX12の経験も必要です。

 

本書のCPUサンプル全てに共通する事は、各サンプルは極力シンプルに書くように努めたということです。

そして、プロジェクトをVisual Studioで開くとソリューションエクスプローラー上にソースファイルが2つ見えると思いますが、皆さんが注目するのはRaytracer.cppだけです

もう1つのソースファイルDrawPixels.cppのほうはウィンドウ上にピクセルを表示する仕事を担うモジュールであり、レイトレーシングとは本質的に関係ありません。もちろんソースを眺めるのは自由ですが、あまり意味はないかと思います。

また、mathフォルダには本書サンプルで使う算術演算の全てを実装したベアピクセル独自ライブラリ(筆者独自ライブラリ)がありますが、これも単なる道具として使うことをお薦めします。

レイトレーシングの勉強をするわけですからレイトレーシングのロジック(Raytracer.cpp)そのものだけに集中してほしいと思います。兎にも角にもレイトレースそのものを理解することを第1に考えましょう。

 

なお、レイトレーシングそのものは理解されている読者も居るでしょう。DXRでのレイトレーシングを知りたくて本書を手にしている事と思います。そのような方にとってCPU編は無用にも思えますが、DXRの解説にレイトレーシング自体の解説は不可分なため、そこはご了承いただきたいと思います。

目次

はじめに 1

第1編 CPU版 2

1章 いきなりDXRは無理 3

2章 CPU版を作成した理由 4

理解のし易さ 5

応用のし易さ 6

3章 はじめてのレイトレーシング 7

1節 レイトレーシングとは 8

レイとは 8

レイトレーシングの流れ 9

トライアングルが重なっている場合 12

ラスタライズとレイトレースの関係 14

2節 スフィアのレンダリング 16

プロシージャルモデルとは 16

サンプル解説 17

4章 反射 33

1節 反射物体のレンダリング 34

サンプル解説 35

5章 屈折 40

1節 屈折物体のレンダリング 41

サンプル解説 45

6章 カメラ 50

1節 カメラの追加 51

サンプル解説 51

7章 影 53

1節 影の仕組み 54

シャドウレイ 54

2節 影のレンダリング 56

サンプル解説 56

3節 エリアライトの影 58

サンプル解説 58

シャドウレイを増やす 61

乱雑さを加える 63

8章 ポリゴン(トライアングル) 66

1節 トライアングルのレンダリング 67

サンプル解説 67

2節 複数のトライアングルのレンダリング 73

サンプル解説 73

9章 外部モデルデータを読み込む 75

1節 ポリゴンメッシュをファイルからロードする 76

サンプル解説 76

10章 高速化 78

1節 2つのアプローチ 79

空間分割 79

バウンディングボリューム 80

それぞれの特徴 80

2節 BV バウンディングボリュームを使う 81

サンプル解説 81

3節 BVH バウンディングボリュームヒエラルキーを使う 83

階層にする理由 84

コストはゼロではない 84

空間分割と同じこと 84

サンプル解説 84

4節 速度比較 90

パフォーマンスを左右する事柄 90

計測結果一覧 91

特徴 93

結論 94

11章 マテリアル 95

1節 マテリアルの追加 96

サンプル解説 96

第2編 DXR版 98

第1章 DXR版を作成するために必要なこと 99

1節 DXRとは 100

2 読者に求められるバックグラウンド 101

1つ目 レイトレーシングそのものの経験 101

2つ目 DX12の経験 101

3節 学習方法 102

4節 本書では2種類のジオメトリを扱います 103

第2章 はじめてのDXR 104

1節 共通事項 105

2節 DXR固有部分の説明 106

RTPSOとは 106

DXILライブラリとは 107

アソシエーションとは 107

シェーダーコンフィグとは 108

パイプラインコンフィグとは 109

ペイロードとは 109

ローカル(グローバル)ルートシグネチャとは 110

シェーダーテーブルとは 111

Ray Typeとは 112

BLAS/TLASとは 112

3節 スフィアのレンダリング 114

DXRアプリ 画面表示の仕組み 114

サンプル解説 115

3章 反射 127

1節 反射物体のレンダリング 128

サンプル解説 128

4章 屈折 130

1節 屈折物体のレンダリング 131

サンプル解説 131

5章 カメラ 133

1節 カメラの追加 134

サンプル解説 134

6章 影 136

1節 影のレンダリング 137

サンプル解説 137

2節 エリアライトの影 141

サンプル解説 141

シャドウレイを増やす 142

乱雑さを加える 144

7章 ポリゴン(トライアングル) 147

1節 トライアングルのレンダリング 148

サンプル解説 148

2節 法線の渡し方 150

サンプル解説 150

3節 複数のトライアングルのレンダリング 154

サンプル解説 154

8章 外部モデルデータを読み込む 155

1節 ポリゴンメッシュをファイルからロードする 156

サンプル解説 157

9章 マテリアル 159

1節 マテリアルの追加 160

サンプル解説 160

10章 高速化 162

1節 高速化は既に図られている 163

2節 アプリ側でできる高速化 164

11章 Amazing Scene 165

1節 モデルの配置 166

サンプル解説 166

2節 ピクセルが潰れる問題 167

サンプル解説 169

3節 フォンシェーディングの追加 171

サンプル解説 171

4節 反射の追加 172

5節 屈折の追加 173

6節 ソフトシャドウの追加 174

7節 反射パネルを追加 175

サンプル解説 175

8節 キー操作の追加 177

サンプル解説 177

12章 付録 179

1節 表紙に用いたプログラム 180

著者紹介 182

本書 外観

付属サンプルプログラム実行時ビデオ

 

本書は電子書籍です

本書はPDFというデジタルファイルになります。本書の閲覧はパソコン、ノートパソコンはもちろん、タブレット端末、電子書籍リーダー(カラーPDFが閲覧可能なもの)、その他カラーPDF電子書籍が閲覧可能なデバイスで可能です。

セキュリティについて

パスワード

セキュリティの理由により、本書を開く際には、パスワードの入力が必要になります。
パスワードはご購入されたときに入力したメールアドレスになります。

Hikkei_EBook_Pass

透かし

本書のページ下部に、ご購入者の氏名で”透かし”が入ります。これは無断複製の抑止力のための措置です。
(その氏名での透かしは、もちろんそのご購入者様の電子書籍だけに入ります。)

Hikkei_EBook_WaterMark

内容のコピー、印刷について

本書のテキスト及び図表はコピーできません。また本書は印刷できません
また、内容をコピーあるいは印刷するような改造はしないでください。

決済後のダウンロード

ご 決済時に入力されたメールアドレス宛てに、決済後12時間以内にダウンロード先のURLを記入したメールを送信いたします。メール受信後その URLに行き、電子書籍(PDFファイル)をダウンロードしてください。ダウンロードできる期間は2週間となります。(通常、ダウンロードは1回で済みま す。閲覧の度にダウンロードが必要なわけではありません)

ご購入

当サイトオンラインショップで販売しています。