THE ICED DRINK– 書籍紹介
画像は実際のサンプルプログラム実行時画面です。
THE ICED DRINK(本書はPDF書籍です)
リアルなアイスドリンクを作る。
DXRによるガラス・液体・氷レンダリング
本書では、DirectX Raytracing(DXR)を用いて
ガラス、液体、氷といった透明素材のリアルタイムレンダリングを実装します。
屈折・反射・内部構造などを扱いながら、アイスドリンクのシーンを段階的に構築していきます。
本書の特徴
本書は、DirectX Raytracing(DXR)を用いたリアルタイムレンダリングの技術を解説する実践的な技術書です。題材として、ガラスのグラス、内部の液体、そして浮かぶ氷を持つ「アイスドリンク」のシーンを作成します。
ガラス、液体、氷といった透明素材は、屈折や反射などの複雑な光の挙動を伴うため、リアルタイムCGにおいて難しいテーマの一つです。本書ではこれらを段階的に実装しながら、DirectX Raytracingによる透明物体レンダリングの仕組みを理解していきます。
解説はサンプルプログラムを中心に進められ、ガラスのレンダリングから始まり、液体の追加、氷の表現へとシーンを拡張していきます。各ステップで必要となるレイトレーシングのロジックやシェーダーの実装を具体的に説明し、最終的にはリアルタイムで描画されるアイスドリンクのシーンを完成させます。
DirectX Raytracingを用いたリアルタイムレンダリングの理解を深めたい方や、透明素材の表現を実装レベルで学びたい開発者に向けた内容となっています。
対象読者
・DirectX Raytracing(DXR)によるリアルタイムレンダリングを学びたいプログラマ
・レイトレーシングの実装をコードレベルで理解したい開発者
・ガラスや液体など透明素材のレンダリング手法に興味のある方
・C++とHLSLによるリアルタイムCGプログラミングの経験を持つ方
DXR を完全に初めて触る方でも問題ありません。
BLAS / TLAS / Shader Table などの専門用語は最低限に抑え、概念中心で解説しています。
必要な開発環境
・Windows 10 / 11
・Visual Studio 2022 以降
・DXR対応GPU必須(RTXシリーズ推奨)
本書には、動作確認用プログラムも付属しています。
付属データ
・BRenderer ライブラリ(ヘッダ+lib+dll)
・各章のサンプルプログラム
・モデルデータ、テクスチャデータ
・完成サンプル
※ BRenderer のソースコードは非公開です。
このシリーズについて
本書は、リアルタイムレンダリング技術を題材に、具体的なテーマを一つ取り上げてその実装を解説するシリーズの一冊です。各巻では特定のモチーフを中心に据え、実際に動作するサンプルプログラムをベースにしながら、レンダリングアルゴリズムやシェーダーの実装を段階的に解説します。
シリーズでは、理論だけではなく「実際に動くプログラム」を通して技術を理解することを重視しています。コードを読みながらレンダリングの仕組みを追い、最終的に完成したシーンを自分の環境で再現できる構成になっています。
本書『The Iced Drink』では、ガラスのグラス、内部の液体、そして氷を含むアイスドリンクのシーンを題材に、DirectX Raytracing(DXR)による透明素材のリアルタイムレンダリングを扱います。シリーズの他の巻と同様に、サンプルプログラムを中心とした実装ベースの解説となっています。
一冊につき、一つの質感。
一冊につき一つの質感に焦点を当てることで、特定の表現を深く理解し、実装レベルで習得できる構成になっています。
著者より
リアルタイムCGの世界では、多くの技術がアルゴリズムや数式として説明されます。しかし実際の開発では、「それをどのようにコードとして実装するのか」が最も重要になります。
本シリーズでは、特定のテーマを一つ選び、そのレンダリングを実際に動作するプログラムとして実装しながら解説することを目的としています。理論だけでなく、コードを通して理解することを重視しています。
『The Iced Drink』では、ガラスのグラス、内部の液体、そして氷を持つアイスドリンクのシーンを題材に、DirectX Raytracing(DXR)による透明素材のレンダリングを扱います。これらの素材は屈折や反射などの複雑な光の挙動を伴いますが、レイトレーシングではその挙動を比較的自然な形で表現することができます。
本書が、リアルタイムレイトレーシングの理解を深める一助になれば幸いです。
書籍外観





「はじめに(全文)」
ガラスは、レイトレーシングの面白さが最もよく現れる題材の一つです。
光が境界で屈折し、内部を通過し、再び外へ出ていく。
その結果として、歪み、反射、透明感といった現象が自然に現れます。
レイトレーシングでは、これらの現象を特別な近似なしに扱うことができます。
現実の光の挙動をそのままモデル化できる点は、この手法の大きな特徴です。
前作 THE GLASS では、ガラスという単一媒質の透明体を扱いました。
単一媒質であっても、屈折や内部反射を正しく処理することで、リアルなガラス表現を得ることができます。
しかし、現実の物体は単一媒質だけで構成されているわけではありません。
グラスの中に液体が入り、
さらに氷が浮かぶ。
このような状況では、光は
空気
ガラス
液体
氷
といった複数の媒質を連続して通過します。
媒質が増えると、光の経路も複雑になります。
屈折は一度ではなく、何度も発生します。
このとき重要になるのが、現在レイがどの媒質の中にいるのかを正しく管理することです。
本書では、そのための方法として 媒質スタック(media stack) を使用します。
スタック構造を用いることで、
入射と出射の関係を整理し、
複数媒質の入れ子構造を安定して扱うことができます。
本書の目的は、理論を網羅することではありません。
シェーダーの処理とレンダリング結果の関係を確認しながら、
実際に動作するプログラムを通して、透明体表現の構造を理解することです。
最終的には、
ガラス
液体
氷
を含むシーンを、DirectX12 + DXR によるリアルタイムレイトレーシングで描画します。
複数媒質の透明体は、一見すると複雑に見えます。
しかし構造を整理すれば、その動作は決して難しいものではありません。
本書が、リアルタイムレイトレーシングによる透明体表現を理解する一助になれば幸いです。
目次
サンプルプログラムについて 0
はじめに 1
目次 3
第1章 空のタンブラー 7
1.1節 本章の目的 7
1.1.1項 本章で作るもの 7
1.2節 シーン構成 7
1.2.1項 配置するメッシュ 7
1.2.2項 DOFは使用しない 8
1.3節 厚みを持つ容器 8
1.3.1項 二つの境界 8
1.3.2項 内部にいるという状態 10
1.3.3項 そのための記録構造 10
1.4節 入射と出射の判定 11
1.5節 反射回数の制御 11
1.5.1項 1項 traceCount と g_maxTraceCount 11
1.5.2項 回数を変えて観察する 12
1.6節 厚みの影響 13
1.7節 本章の到達点 13
第2章 液体の導入 15
2.1節 本章の目的 15
2.1.1項 内部空間に媒質を追加する 15
2.2節 境界の増加 15
2.2.1項 空気とガラスだけの場合 15
2.2.2項 液体を入れた場合 16
2.3節 fluid_only.obj の追加 17
2.3.1項 メッシュのロード 17
2.3.2項 InstanceID の意味 17
2.4節 屈折率の違い 17
2.4.1項 refractIndex の役割 17
2.4.2項 入射と出射の組み合わせ 17
2.5節 視覚的変化 18
2.5.1項 液体の境界線 18
2.5.2項 内部反射の変化 18
2.6節 本章の到達点 19
第3章 氷の導入 20
3.1節 本章の位置づけ 20
3.2節 氷は「入れ子」ではない 21
3.2.1項 液体とは違う存在 21
3.2.2項 レイの経路の複雑化 21
3.3節 スタック構造の本当の意味 22
3.3.1項 複数 InstanceID が積まれる 22
3.3.2項 なぜスタックでなければならないのか 22
3.4節 屈折率の連鎖 22
3.4.1項 refractIndex の連続適用 22
3.4.2項 視覚的変化 23
3.5節 trace回数の重要性 24
3.6節 本章の到達点 24
第4章 吸収と色 25
4.1節 本章の位置づけ 25
4.2節 透明体は本当に透明か 25
4.2.1項 通過距離の意味 25
4.3節 色付き液体 26
4.3.1項 液体の色設定 26
4.3.2項 距離による濃度差 26
4.4節 氷との違い 27
4.5節 スタックと吸収の関係 27
4.6節 本章の到達点 28
第5章 最終仕上げと演出 29
5.1節 本章の目的 29
5.2節 被写界深度の再導入 29
5.2.1項 DOFの役割 29
5.2.2項 視覚的効果 30
5.3節 trace回数の最適化 31
5.3.1項 回数と品質 31
5.3.2項 無限反射との違い 31
5.4節 ライト位置の調整 32
5.4.1項 エリアライト 32
5.4.2項 ポイントライト 32
5.5節 最終構成 32
5.6節 本章の到達点 32
第6章 パラメータ検証 34
6.1節 本章の目的 35
6.2節 屈折率の影響 35
6.3節 吸収強度の影響 37
6.4節 trace回数の影響 40
6.5節 本章のまとめ 42
第7章 媒質スタックの詳細 43
7.1節 本章の位置づけ 44
7.2節 スタックの基本構造 45
7.3節 状態遷移の具体例 45
7.3.1項 ケース1 空気 → ガラス 45
7.3.2項 ケース2 ガラス → 液体 45
7.3.3項 ケース3 液体 → 氷 46
7.3.4項 ケース4 氷 → 液体(出射) 46
7.3.5項 ケース5 液体→ ガラス(出射) 47
7.3.6項 ケース6 ガラス → 空気(出射) 47
7.4節 push と pop の判定 47
7.5節 なぜフラグでは成立しないのか 48
7.6節 スタック設計の意味 48
7.7節 本章のまとめ 48
第8章 パフォーマンスと実用性 49
8.1節 本章の目的 50
8.2節 解像度の影響 50
8.3節 trace回数と負荷 52
8.4節 エリアライトのレイ数 54
8.5節 氷メッシュの影響 56
8.6節 TDR(Timeout Detection and Recovery) 56
8.7節 実用的な推奨設定 56
8.8節 本章のまとめ 56
第9章 設計と拡張 57
9.1節 本章の位置づけ 57
9.2節 本書の設計の特徴 57
9.3節 Iced Drink の先へ 57
9.4節 体積表現への可能性 58
9.5節 本書の到達点 58
9.6節 最後に 58
Appendix A 動作環境と事前確認 59
A.1 対応 OS 59
A.2 GPU 要件 59
A.3 GPU ドライバ 59
A.4 開発環境 59
A.5 環境チェックプログラムについて 60
A.6 起動しない場合の基本確認事項 60
A.7 本書の想定について 60
Appendix B BRenderer API 一覧 61
B.1 Renderer の生成と破棄 61
B.2 初期化・描画制御 61
B.3 メッシュ関連 62
B.4 ライト関連 62
B.5 カメラ関連 62
B.6 レイトレーシング制御 63
B.7 デバッグ・補助機能 64
B.8 内部実装について 64
B.9 本 Appendix の使い方 65
Appendix C 本書で扱わなかったこと 66
C.1 DirectX12 の低レベル初期化 66
C.2 DXR の内部構造 66
C.3 本書のスタンス 66
Appendix D トラブルシューティング 68
D.1 サンプルが起動しない 68
D.2 ウィンドウは表示されるが、何も描画されない 68
D.3 動作が極端に遅い 68
D.4 実行中にアプリケーションが強制終了する 69
D.5 デバッグコンソールに何も表示されない 69
D.6 それでも解決しない場合 69
Appendix E この先の発展 70
E.1 屈折率を変える 70
E.2 ガラスの厚みを変える 70
E.3 反射回数と描画品質 70
E.4 別の表現への応用 71
E.5 次の一歩 71
著者紹介 72
著作権および利用条件について 74
免責事項 75
THE ICED DRINK 76