THE GLASS – 書籍紹介

THE GLASS – 書籍紹介

画像は実際のサンプルプログラム実行時画面です。

THE GLASS(本書はPDF書籍です)

DirectX12 + DXR によるリアルタイムなガラス表現

これは、完成させるための本です。

「THE GLASS」は、ガラスの質感表現だけを徹底的に掘り下げる技術書です。
DirectX12 と DXR(DirectX Raytracing)を用いて、リアルタイムに屈折・反射を扱うガラス表現を、ステップアップ形式で完成まで導きます。

一般的な解説書のように、多くの技術を広く浅く網羅することは目的にしていません。
テーマを「一つ」だけに絞り込み、章を細かく分けながら、読者が必ず完成体験に到達できるように設計されたシリーズです。

本書の特徴

・DirectX12 / DXR の複雑な初期化処理を BRendererライブラリに完全カプセル化
・読者が書くコードは 数行から数十行程度
ウィンドウ作成 → DXR初期化 → メッシュ表示 → 屈折・反射 → 仕上げ と段階的に進行
・各章に 実行結果スクリーンショットを掲載
・すべてのサンプルプログラムを 本書に同梱しています。
・完成形から逆算して構成された、挫折しにくい設計

難しい理論よりも、まず 実際にガラスを描くことを最優先としています。

対象読者

・DirectX12 やレイトレーシングに興味がある方
・「途中で挫折した経験」がある方
・理論よりも まずは動くものを作りたい方
・C++の基本構文を理解している初中級者

DXR を完全に初めて触る方でも問題ありません。
BLAS / TLAS / Shader Table などの専門用語は最低限に抑え、概念中心で解説しています。

必要な開発環境

・Windows 10 / 11
・Visual Studio 2022 以降
・DXR対応GPU必須(RTXシリーズ推奨)

本書には、動作確認用プログラムも付属しています。

付属データ

・BRenderer ライブラリ(ヘッダ+lib+dll)
・各章のサンプルプログラム
・モデルデータ、テクスチャデータ
・完成サンプル

※ BRenderer のソースコードは非公開です。

このシリーズについて

「THE GLASS」は、単テーマ集中型シリーズの第1弾です。
今後、次のテーマを予定しています。頻度は2ヵ月に1テーマを予定しています。

・THE JELLY(ゼリー表現)
・THE SODA(ソーダ/気泡表現)
・THE FIRE(炎表現)

一冊につき、一つの質感。
ゴールはただ一つ、「自分で作れるようになること」です。

著者より

DirectX12 や DXR は非常に強力な技術ですが、
その複雑さゆえに、多くの人が入り口で挫折してしまいます。

「理解するだけで終わらせない。
実際に“作品として完成させる”喜びまで届けたい。

その思いから、このシリーズを設計しました。

書籍外観

「はじめに(全文)」

リアルタイム CG の世界には、誰もが一度は憧れる表現があります。ガラス、液体、炎、そして金属のような複雑な反射や屈折です。これらは、近年のリアルタイムレイトレーシング(DXR など)の登場によって、以前より現実的に扱えるようになりました。しかし現場の感覚として、実装の難しさは依然として最難関の部類に入ります。

DirectX12 や DXR は強力ですが、初心者が最初に触れるには情報量が多すぎます。初期化、リソース管理、同期、パイプライン構築など、表現そのものとは別の要素が壁になり、肝心の「作品を完成させる」前に疲れてしまうことが少なくありません。これが、リアルタイムレイトレーシングがなかなか浸透しない大きな理由だと考えています。

本書「THE GLASS」は、その壁を越えるために設計しました。目的は「すべてを理解すること」ではありません。読者自身が、実際に動く作品としてガラス表現を完成させることです。完成まで到達できる読者を増やすことを、最優先に置いています。

本書のアプローチは次のとおりです。

・リアルタイムレイトレーシングを、誰でも再現できる形に落とし込みます

・ただし、C++ の基礎とビルドの経験(ソリューションを開いてビルドできる程度)は必要です

・DirectX12 と DXR の低レベル実装は、著者のライブラリ BRenderer にカプセル化します

・読者は難解な初期化コードを直接書かず、少ないコードで表現に集中できます

・章ごとに 1 つのサンプルを用意し、ステップアップ形式でゆっくり進みます

・毎章「実際に動く結果」を確認しながら進めるため、体験を積み上げられます

・読者が挫折しやすい点を先回りして排除し、迷わない進行を重視します

・説明は簡潔にし、読者を疲れさせない読み口を目指します

本書の第 1 章では、最終的に完成するガラス表現を先に動かして確認します。ここで「ゴール」を目で見てから、次章以降で土台から積み上げていきます。最初はウィンドウ作成のような最小構成から始まり、章を追うごとに機能を追加して、最終形へ到達します。

なお、本書は DirectX12 や DXR の詳細な解説書ではありません。用語として名前が出ることはありますが、内部構造を深く理解することを目的にはしません。ここで必要なのは、正しい順序でサンプルを動かし、設定を変え、見た目の変化を確かめることです。その体験が、次の学習や発展の強い土台になります。

また、この「単一テーマを深掘りし、完成まで導く」という設計は、本書だけで終わりません。本シリーズは今後も続きます。次巻以降では「ゼリー」「ソーダ」「炎」など、ひとつのテーマを同じ流儀で段階的に構築し、読者が作品として完成できることを重視していきます。

本書を読み終えたとき、読者が「難しいはずの表現を自分の手で動かした」という手応えを得られること。これが 「THE GLASS」の目標です。

それでは、まず完成形を確認するところから始めましょう。

目次

サンプルプログラムについて 0
はじめに 1
目次 3
第1章 完成形を確認する 7
1.1節 実行結果の確認 7
1.2節 本章の位置づけ 7
第2章 ウィンドウを作成する 9
2.1節 本章のゴール 9
2.2節 サンプルプログラム全体 10
2.3節 BRenderer をインクルードしている理由 11
2.4節 WinMain 関数とアプリケーションの開始点 12
2.5節 ウィンドウクラスの登録 12
2.5.1項 ウィンドウプロシージャの指定 12
2.6節 ウィンドウの生成 12
2.7節 メッセージループ 13
2.8節 WndProc と終了処理 13
2.9節 本章のまとめ 14
第3章 DXRを初期化する 15
3.1節 実行結果の確認 15
3.2節 サンプルプログラム全体 16
3.3節 DXR 初期化処理のポイント 18
3.4節 本章のまとめ 19
第4章 study.cpp内に初期化関数を作る 20
4.1節 この章の目的 20
4.2節 実行結果の確認 20
4.3節 サンプルコード全文(study.cpp) 22
4.4節 初期化関数を分離する意味 24
4.5節 BRendererへのコールバック登録 25
4.6節 InitStudy関数の中身 25
4.7節 この章のまとめ 25
第5章 study.cpp内にメインループを作る 27
5.1節 この章の目的 27
5.2節 実行結果の確認 27
5.3節 サンプルコード全文(study.cpp) 29
5.4節 メインループ用コールバックの登録 32
5.5節 Render関数とメインループの関係 32
5.6節 MainLoop関数の中身 32
5.7節 この章のまとめ 33
第6章 物体メッシュファイルを読み込む 34
6.1節 この章の目的 34
6.2節 実行結果の確認 34
6.3節 サンプルコード全文(study.cpp) 35
6.4節 メッシュファイルを読み込む 37
6.5節 カメラ位置の設定 38
6.6節 モデルの変換行列を設定する 38
6.7節 この章のまとめ 38
第7章 複数のメッシュを読み込み、配置する 40
7.1節 この章の目的 40
7.2節 実行結果の確認 40
7.3節 サンプルコード全文(study.cpp) 41
7.4節 複数のメッシュを読み込む 44
7.5節 位置情報を配列で管理する 44
7.6節 ループでまとめて配置する 45
7.7節 この章のまとめ 45
第8章 カメラ(視点)を移動する 46
8.1節 この章の目的 46
8.2節 実行結果の確認 46
8.3節 サンプルコード全文(study.cpp) 47
8.4節 カメラの初期位置と向き 50
8.5節 キーボードでカメラを移動する 51
8.6節 視点を動かす意味 51
8.7節 この章のまとめ 51
第9章 ライトをセットしてシーンを照らす 53
9.1節 この章の目的 53
9.2節 実行結果の確認 53
9.3節 サンプルコード全文(study.cpp) 54
9.4節 ポイントライトを配置する 58
9.5節 エリアライトを追加する 58
9.6節 ライト減衰を調整する 58
9.7節 この章のまとめ 59
第10章 カメラを回転してシーンを見渡す 60
10.1節 この章の目的 62
10.2節 サンプルプログラム全体 62
10.3節 カメラの初期位置と向き 67
10.4節 カメラの移動操作 67
10.5節 カメラの回転操作 68
10.6節 視点を動かして分かること 68
10.7節 まとめ 69
第11章 カメラをズームイン、アウトする 70
11.1節 この章の目的 71
11.2節 サンプルプログラム全体 71
11.3節 カメラズーム処理 77
11.4節 ズームと移動の違い 77
11.5節 ズームして分かるガラスの特徴 77
11.6節 まとめ 78
第12章 物体メッシュを移動、回転する 79
12.1節 サンプルコード全文(study.cpp) 80
12.2節 物体を動かすということ 85
12.3節 メッシュ行列の設定 85
12.4節 移動と回転がガラス表現に与える影響 85
12.5節 まとめ 85
第13章 レイの反射上限を変更する 87
13.1節 この章の目的 87
13.2節 実行結果の確認 87
13.3節 サンプルコード全文(study.cpp) 93
13.4節 レイの反射回数とは何か 99
13.5節 反射回数を変更するコード 100
13.6節 実時間で変更できる意味 100
13.7節 この章のまとめ 101
第14章 シェーダーを編集して変化を見る 102
14.1節 この章の目的 102
14.2節 実行結果の確認 102
14.3節 サンプルコード全文(study.cpp) 103
14.4節 ClosestHit シェーダーの役割 113
14.5節 赤色が意味するもの 114
14.6節 なぜ赤く表示すると分かりやすいのか 114
14.7節 シェーダーを編集して遊んでみる 115
14.8節 この章のまとめ 115
第15章 テクスチャーを貼る 116
15.1節 この章の目的 116
15.2節 実行結果の確認 116
15.3節 サンプルコード全文(study.cpp) 118
15.4節 テクスチャーを読み込む 125
15.5節 環境反射としてテクスチャーを使う 125
15.6節 反射が豊かに見える理由 126
15.7節 この章のまとめ 126
Appendix A 動作環境と事前確認 130
A.1 対応 OS 130
A.2 GPU 要件 130
A.3 GPU ドライバ 130
A.4 開発環境 130
A.5 環境チェックプログラムについて 131
A.6 起動しない場合の基本確認事項 131
A.7 本書の想定について 131
Appendix B BRenderer API 一覧 132
B.1 Renderer の生成と破棄 132
B.2 初期化・描画制御 132
B.3 メッシュ関連 133
B.4 ライト関連 133
B.5 カメラ関連 133
B.6 レイトレーシング制御 134
B.7 デバッグ・補助機能 135
B.8 内部実装について 135
B.9 本 Appendix の使い方 136
Appendix C 本書で扱わなかったこと 137
C.1 DirectX12 の低レベル初期化 137
C.2 DXR の内部構造 137
C.3 シェーダープログラムの実装 137
C.4 物理ベースレンダリングの理論 138
C.5 本書のスタンス 138
Appendix D トラブルシューティング 139
D.1 サンプルが起動しない 139
D.2 ウィンドウは表示されるが、何も描画されない 139
D.3 動作が極端に遅い 139
D.4 実行中にアプリケーションが強制終了する 140
D.5 デバッグコンソールに何も表示されない 140
D.6 それでも解決しない場合 140
Appendix E この先の発展 141
E.1 屈折率を変える 141
E.2 ガラスの厚みを変える 141
E.3 反射回数と描画品質 141
E.4 別の表現への応用 142
E.5 次の一歩 142
著者紹介 143
著作権および利用条件について 145
免責事項 146
THE GLASS 147