HLSL シェーダーの魔導書 シェーディングの基礎からレイトレーシングまで(清原 隆行)|翔泳社の本
  1. ホーム >
  2. 書籍 >
  3. HLSL シェーダーの魔導書 シェーディングの基礎からレイトレーシングまで

HLSL シェーダーの魔導書 シェーディングの基礎からレイトレーシングまで


形式:
書籍
発売日:
ISBN:
9784798164281
定価:
5,060(本体4,600円+税10%)
仕様:
B5変・584ページ
カテゴリ:
プログラミング・開発
キーワード:
#プログラミング,#開発環境,#開発手法,#Web・アプリ開発
紙の書籍

光を自在に操るための
基本の技術を手に入れろ。

DirectXだけでなくUnityでも使われているシェーダー言語HLSL。
本書は、グラフィックスプログラマやテクニカルアーティストをめざす人が、
ハンズオン形式の豊富なサンプルを使って、3Dグラフィックを演出するシェーディング技術を
学ぶための教科書です。

本書では、サンプルプログラムとして、DirectX 12のコーディングをほとんど意識せず、
HLSLプログラミングに集中できるようなミニエンジンが提供されます。

シェーダーの基礎であるレンダリングパイプラインから、最新技術であるレイトレーシングまで、
本書を読めば、あなたもグラフィックスプログラマの仲間入りです!

~本書の内容~
・Chapter 1:レンダリングパイプライン入門
・Chapter 2:はじめてのシェーダー
・Chapter 3:シェーダープログラミングの基本(2)
・Chapter 4:ライティング基礎
・Chapter 5:ライティング発展
・Chapter 6:さまざまなテクスチャの利用
・Chapter 7:PBR(物理ベースレンダリング)
・Chapter 8:2D描画の基礎
・Chapter 9:発展的な2D描画
・Chapter 10:ポストエフェクト
・Chapter 11:シャドウイング
・Chapter 12:ディファードレンダリング
・Chapter 13:ディファードレンダリングとフォワードレンダリングの融合
・Chapter 14:3Dゲームで使える発展的シェーダー
・Chapter 15:コンピュートシェーダー
・Chapter 16:TBR(Tile Based Rendering)
・Chapter 17:レイトレーシング

多彩な表現を手に入れたい人のための新しい教科書

光を自在に操るための基本の技術

DirectXだけでなくUnityでも使われているシェーダー言語HLSL。本書は、グラフィックスプログラマやテクニカルアーティストをめざす人が、ハンズオン形式の豊富なサンプルを使って、3Dグラフィックを演出するシェーディング技術を学ぶための教科書です。シェーダーの基礎であるレンダリングパイプラインから、最新技術であるレイトレーシングまで、本書を読めば、あなたもグラフィックスプログラマの仲間入りです!

多彩な表現を手に入れよう!

PBR(物理ベースレンダリング)

PBR(物理ベースレンダリング)

現在のハイエンドゲームのライティングの計算のディファクトスタンダード(事実上の標準)になっている、PBR(物理ベースレンダリング)について見ていきます。「PBR」や「物理ベースレンダリング」についてインターネットなどで調べると、難しい話がたくさん出ますが、本書では難しい言葉はできるだけ使わずに、かみ砕いて説明します。

ポストエフェクト

ポストエフェクト

最近の3Dゲームでは、カメラのピンボケ現象をシミュレーションする被写界深度や、光があふれ出るブルームといわれる現象を疑似的に再現しています。これらはポストエフェクトと呼ばれる手法で実現されています。本書では、ポストエフェクトの基礎となるオフスクリーンレンダリングについて説明したあとで、モノクロ化、ブルーム、被写界深度など、いくつかのポストエフェクトを紹介します。

シャドウイング

シャドウイング

3Dゲームでリアルなグラフィックスを実現するためには、「影(シャドウ) 」が非常に重要な要素です。また、影はグラフィックスの質という側面だけではなく、3Dオブジェクトが空間上でどこにあるかをユーザーに教えるための重要な要素となります。本書では、影描画の基本となる、古典的な影生成アルゴリズムの「投影シャドウ」について説明します。

ディファードレンダリング

ディファードレンダリング

ディファードレンダリングはXbox 360やPlayStation 3の頃に生まれたレンダリング手法であり、比較的新しい手法だといえます。特にPlayStation 3はこの手法に向いたアーキテクチャだったため、ディファードレンダリングが採用されたゲームがいくつもありました。本書では、現在の主流になってきているレンダリング手法、ディファードレンダリングについて見ていきます。

コンピュートシェーダー

コンピュートシェーダー

DirectX 9までは、これら2つのシェーダーステージしか用意されていませんでした。しかし、DirectX 10からは「GPUに汎用的な処理を行わせるプログラムを簡単に記述したい」という開発者の要望に応える形で、DirectComputeという名称のAPIが提供され、コンピュートシェーダーという新しいシェーダーステージが追加されました。コンピュートシェーダーはHLSLで記述でき、非常に柔軟に計算結果を出力できるようになっています。

レイトレーシング

レイトレーシング

レイトレーシング法(レイトレーシング、レイトレ)とは光の伝搬をシミュレーションすることによって、非常にリアルなコンピューターグラフィックスを表現する一般的な手法の1つです。本書では、PlayStation 5など次世代のリアルタイムCGプログラミングで重要な要素となるレイトレーシングについて見ていきます。

開発環境、動作環境について

推奨動作環境

本書では、開発環境としてWindows 10上のVisual Studio 2019を使用しています。

また、動作環境として、ゲーミングPCなど、一定レベル以上の環境が必要となります。例として、動作確認を行った環境としては以下のようなものです。

  • CPU:Intel Core i7 9750H(2.60GHz、6コア)
  • RAM:16.0GB
  • GPU:NVIDIA GeForce RTX 2060(6GB)

※ Chapter 17で扱うDirectX Raytracing(DXR)が動作するためには、 GeForce GTX 1060もしくはGeForce GTX 1660以上のグラフィックスボード(GPU)が必要です。

Chapter 1 レンダリングパイプライン入門
1.1 CPUとGPU
1.2 メインメモリとグラフィックスメモリ
1.3 絵が表示されるまでの流れ

Chapter 2 はじめてのシェーダー
2.1 DirectX 7.1以前のレンダリングパイプライン
2.2 シェーダーの導入
2.3 頂点シェーダー入門
2.4 ピクセルシェーダー入門

Chapter 3 シェーダープログラミングの基本
3.1 座標変換
3.2 テクスチャマッピング
3.3 複雑な3Dモデルの表示へ

Chapter 4 ライティング基礎
4.1 ライティングなしの3Dモデル表示
4.2 ライトの種類
4.3 反射:Phongの反射モデル

Chapter 5 ライティング発展
5.1 ポイントライト
5.2 スポットライト
5.3 リムライト
5.4 半球ライト

Chapter 6 さまざまなテクスチャの利用
6.1 法線マップ
6.2 スペキュラマップ
6.3 アンビエントオクルージョンマップ(AOマップ)

Chapter 7 PBR(物理ベースレンダリング)
7.1 PBRとは
7.2 ディズニーの論文によるPBR

Chapter 8 2D描画の基礎
8.1 DirectX 12で2D描画
8.2 2D表示
8.3 αブレンディング

Chapter 9 発展的な2D描画
9.1 リニアワイプ
9.2 その他のワイプ
9.3 画像の色を変化させる

Chapter 10 ポストエフェクト
10.1 オフスクリーンレンダリング
10.2 モノクロ化
10.3 ブラー
10.4 ブルーム
10.5 川瀬式ブルームフィルター
10.6 被写界深度
10.7 カメラの絞りによる六角形ブラー

Chapter 11 シャドウイング
11.1 投影シャドウ
11.2 デプスシャドウ
11.3 PCF(Percentage Closer Filtering)
11.4 VSM(Variance Shadow Maps)
11.5 カスケードシャドウ

Chapter 12 ディファードレンダリング
12.1 フォワードレンダリングとは
12.2 ディファードレンダリングとは
12.3 ディファードレンダリングのメリット
12.4 ディファードレンダリングのデメリット
12.5 ディファードレンダリング入門~拡散反射~
12.6 ディファードレンダリング入門~鏡面反射~
12.7 ディファードレンダリング入門~法線マップ~
12.8 ディファードレンダリング入門~スペキュラマップ~

Chapter 13 ディファードレンダリングとフォワードレンダリングの融合
13.1 半透明問題
13.2 ハイブリッドエンジンの実装

Chapter 14 3Dゲームで使える発展的シェーダー
14.1 レンダリングエンジン
14.2 レンダリングエンジンのカスタマイズ
14.3 輪郭線の描画
14.4 ステルス処理
14.5 ディザリング

Chapter 15 コンピュートシェーダー
15.1 GPGPUとは
15.2 コンピュートシェーダーとは
15.3 データの入力と出力
15.4 構造化バッファー
15.5 アンオーダーアクセスビューとシェーダーリソースビュー
15.6 学生の平均点を計算するプログラムを眺めてみる
15.7 合計点を出力するように改造する
15.8 標準偏差を計算する
15.9 コンピュートシェーダーの並列処理

Chapter 16 TBR(Tile Based Rendering)
16.1 ポイントライト再び
16.2 TBDR(Tile Based Deffered Rendering)
16.3 TBFR(Tile Based Forward Rendering)

Chapter 17 レイトレーシング
17.1 レイトレーシングとは
17.2 レイトレーシング法とラスタライザー法の違い
17.3 レイトレーシング超入門
17.4 テクスチャマッピング
17.5 2次反射
17.6 DirectX Raytracing(DXR)

付属データはこちら

会員特典はこちら

お問い合わせ

内容についてのお問い合わせは、正誤表、追加情報をご確認後に、お送りいただくようお願いいたします。

正誤表、追加情報に掲載されていない書籍内容へのお問い合わせや
その他書籍に関するお問い合わせは、書籍のお問い合わせフォームからお送りください。

利用許諾に関するお問い合わせ

本書の書影(表紙画像)をご利用になりたい場合は書影許諾申請フォームから申請をお願いいたします。
書影(表紙画像)以外のご利用については、こちらからお問い合わせください。

追加情報はありません。
この商品の「よくある質問」はありません。

ご購入いただいた書籍の種類を選択してください。

書籍の刷数を選択してください。

刷数は奥付(書籍の最終ページ)に記載されています。

現在表示されている正誤表の対象書籍

書籍の種類:

書籍の刷数:

本書に誤りまたは不十分な記述がありました。下記のとおり訂正し、お詫び申し上げます。

対象の書籍は正誤表がありません。

最終更新日:2024年03月12日
発生刷 ページ数 書籍改訂刷 電子書籍訂正 内容 登録日
1刷 120
「step-10 距離による影響率を計算する(HLSL)」のコード3行目
2刷
// step-10 距離による影響率を計算する // ポイントライトとの距離を計算する float3 distance = length(psIn.worldPos - ptPosition);
// step-10 距離による影響率を計算する // ポイントライトとの距離を計算する float distance = length(psIn.worldPos - ptPosition);

※リフローEPUBの場合、「5.1.3 ポイントライトを実装する」の「step-10 距離による影響率を計算する(HLSL)」のコードが該当箇所になります。
2022.03.08
1刷 141
「step-2 カメラ空間の法線を求める(HLSL)」2行目のコード
3刷
psIn.normalInView = mul(mView, psIn.normal) // カメラ空間の法線を求める
psIn.normalInView = mul(mView, psIn.normal); // カメラ空間の法線を求める

※リフローEPUBの場合Chapter5「5.3」の「5.3.3 リムライトを実装する」内に該当箇所があります。
2023.05.30
1刷 145
ページ上部のコード 最終行
4刷
float3 hemiLight = skyColor * t + groundColor(1.0f * t);
float3 hemiLight = skyColor * t + groundColor(1.0f - t);

カッコ内の「*」を「-」に修正します。
2024.03.12
1刷 150
Note内の表5.3 「Bボタン」の「キーボード」
2刷
[L]キー
[K]キー
2022.03.08
1刷 159
グレーの枠内の最終行コード
3刷
+ localNormal * normal:
+ localNormal.z * normal;

※リフローEPUBの場合Chapter6「6.1」の「6.1.5 法線空間からワールド空間への変換」内に該当箇所があります。
2023.05.30
1刷 176
「7.1.1 正規化Lambert 拡散反射の実装」の図7.3
2刷

「正規化前」と「正規化後」の画像を入れ替えます。
2022.03.08
1刷 178
表7.1の「subsurface」の説明
3刷
表面化錯乱具合。
表面下錯乱具合。

※リフローEPUBの場合Chapter7「7.2」の「7.2.1 物理的なパラメーター」内に該当箇所があります。
2023.05.30
1刷 196
「step-6 テクスチャをロードする(C++)」3行目のコード
3刷
texture.InitFromDDSFile("Assets/image/test.dds");
texture.InitFromDDSFile(L"Assets/image/test.dds");

※リフローEPUBの場合Chapter8「8.2 2D 表示」内に該当箇所があります。
2023.05.30
1刷 242
「step-4 offscreenRenderTargetに各種モデルを描画する(C++)」最終行のコード
3刷
renderContext.WaitUntilFinishDrawingToRenderTargets(1, rtArray
renderContext.WaitUntilFinishDrawingToRenderTargets(1, rtArray);

※リフローEPUBの場合Chapter10「10.2」の
「10.2.3 画面をモノクロにするポストエフェクトを実装する」内に
該当箇所があります。
2023.05.30
1刷 243
図10.5の上のグレーの枠内のコード 2行目
3刷
float Y = 0.299f * color.r + 0.587f * color.b + 0.114f * color.b;
float Y = 0.299f * color.r + 0.587f * color.g + 0.114f * color.b;

※リフローEPUBの場合Chapter10「10.2」の「10.2.3 画面をモノクロにするポストエフェクトを実装する」内に該当箇所があります。
2023.05.30
1刷 270
「10.4.3 ブルームを実装する」の「step-1 メインレンダリングターゲットを作成する(C++)」のコード
2刷
// レンダリングするカラーバッファーのフォーマットを指定する plModelInitData.m_colorBufferFormat = DXGI_FORMAT_R32G32B32A32_FLOAT;
// レンダリングするカラーバッファーのフォーマットを指定する plModelInitData.m_colorBufferFormat[0] = DXGI_FORMAT_R32G32B32A32_FLOAT;

[0] を追加します。以下の箇所も同様に「~.m_colorBufferFormat」を「~.m_colorBufferFormat[0]」に修正します。

・p273「10.4.3」の「step-4」のコード下から1行目
・p274「10.4.3」の「step-6」のコード下から3行目
・p283「10.5.1」の「step-2」のコード下から4行目
・p292「10.6.3」の「step-3」のコード下から6行目
・p332「11.2.3」の「step-2」7行目
・p353「11.4.2」の「step-5」8行目
----------------------
※リフローEPUBの場合、該当するコードは、上記正誤情報含め以下の通りです。

「10.4.3」
「step-1」の「// レンダリングするカラーバッファーのフォーマットを指定する」のコード「plModelInitData.m_colorBufferFormat」
「step-4」のコード下から4行目「plModelInitData.m_colorBufferFormat」
「step-6」のコード下から4行目「finalSpritInitData.m_colorBufferFormat[」
「10.5.1」「step-2」のコード下から4行目「finalSpriteInitData.m_colorBufferFormat」
「10.6.3」「step-3」のコード下から6行目「combineBokeImageSpriteInitData.m_colorBufferFormat」
「11.2.3」「step-2」のコード7行目「teapotShadowModelInitData.m_colorBufferFormat」
「11.4.2」「step-5」のコード下から9行目teapotShadowModelInitData.m_colorBufferFormat[」
2022.03.08
1刷 297
「10.6.3 被写界深度を実装する」の「step-12 ボケ画像書き込み用のピクセルシェーダーを実装(HLSL)」のコード
2刷
// step-12 ボケ画像書き込み用のピクセルシェーダーを実装
// カメラ空間での深度値をサンプリング
float depth = depthTexture.Sample(Sampler, In.uv);

// カメラ空間での深度値が200以下ならピクセルキル
// -> ボケ画像を書き込まない
clip(depth - 200.0f);

// ボケ画像をサンプリング
float4 boke = bokeTexture.Sample(Sampler, In.uv );

// 深度値から不透明度を計算する
// 深度値800 からボケが始まり、深度値2000 で最大のボケ具合になる
// -> つまり、深度値2000 で不透明度が1 になる
boke.a = min(1.0f, (depth - 800.0f) / 500.0f);

// ボケ画像を出力
return boke;
// step-12 ボケ画像書き込み用のピクセルシェーダーを実装
// カメラ空間での深度値をサンプリング
float depth = depthTexture.Sample(Sampler, In.uv);

// カメラ空間での深度値が800以下ならピクセルキル
// -> ボケ画像を書き込まない
clip(depth - 800.0f);

// ボケ画像をサンプリング
float4 boke = bokeTexture.Sample(Sampler, In.uv );

// 深度値から不透明度を計算する
// 深度値800 からボケが始まり、深度値2000で最大のボケ具合になる
// -> つまり、深度値2000で不透明度が1 になる
boke.a = min(1.0f, (depth - 800.0f) / 2000.0f);

// ボケ画像を出力
return boke;

上から4行目、6行目、下から3行目の数字を修正。
※リフローEPUBの場合Chapter10「10.6 被写界深度」の「10.6.3 被写界深度を実装する」内に該当箇所があります。

2刷で上記の修正をしましたが、内容に誤りがございました。
訂正し、お詫び申し上げます。以下、修正内容です。

下から3行目
誤:boke.a = min(1.0f, (depth - 800.0f) / 2000.0f);
正:boke.a = min(1.0f, (depth - 800.0f) / 1200.0f);
2022.03.08
1刷 324
最上部のコード 6行目
2刷
// シャドウマップを拡張SRV に設定する bgModelInitData.m_expandShaderResoruceView = &shadowMap.GetRenderTargetTexture();
// シャドウマップを拡張SRV に設定する bgModelInitData.m_expandShaderResoruceView[0] = &shadowMap.GetRenderTargetTexture();」

[0] を追加します。以下の箇所も同様に「~.m_colorBufferFormat」を「~.m_colorBufferFormat[0]」に修正します。

・p331「11.2.3」の「step-1」のコード下から10行目
・p353「11.4.2」の「step-6」のコード下から4行目
----------------------
※リフローEPUBの場合、該当するコードは、上記正誤情報含め以下の通りです。

「11.1.4」「step-1」2つ目のコード6行目「bgModelInitData.m_expandShaderResoruceView」

「11.2.3」「step-1」のコード下から11行目「bgModelInitData.m_expandShaderResoruceView」

「11.4.2」「step-6」のコード下から4行目「bgModelInitData.m_expandShaderResoruceView」
2022.03.08
1刷 379
「step-11 シャドウマップにレンダリング(C++)」のコード 下から3行目
3刷
testShadowModel.Draw(renderContext, g_matIdentity, lvpcMatrix[areaNo]);
testShadowModel[areaNo].Draw(renderContext, g_matIdentity, lvpcMatrix[areaNo]);

※リフローEPUBの場合Chapter11「11.5」の「11.5.5 カスケードシャドウマップを実装する」内に該当箇所があります。
2023.06.01
1刷 381
「step-14 近~中距離のシャドウマップにアクセスするための変数を定義(HLSL)」見出しとコードの1行目
3刷
見出し: 近~中距離のシャドウマップに コード: // step-14 近~中距離のシャドウマップにアクセスするための変数を定義
見出し: 近~遠距離のシャドウマップに コード: // step-14 近~遠距離のシャドウマップにアクセスするための変数を定義

※リフローEPUBの場合Chapter11「11.5」の「11.5.5 カスケードシャドウマップを実装する」内に該当箇所があります。
2023.06.01
1刷 394
「step-1 モデルを初期化(C++)」2つ目のグレーの枠内のコード 上から3行目
3刷
modelInitData.m_tkmFilePath = "Assets/modelData/unityChan.tkm";
modelInitData.m_tkmFilePath = "Assets/modelData/sample.tkm";

※リフローEPUBの場合Chapter12「12.5」の「step-1 モデルを初期化(C++)」の最後のグレーの枠内のコード内に該当箇所があります。
2023.06.01
1刷 417
図13.3
3刷
手前に板ポロを描画
手前に板ポリを描画

※リフローEPUBの場合Chapter13「13.1 半透明問題」内に該当箇所があります。
2023.06.01
1刷 426
「●1. シャドウマップへの描画」3行目
3刷
図14.1のように複数本のライトからの影を生成することができるます。
図14.1のように複数本のライトからの影を生成することができます。

※リフローEPUBの場合Chapter14「14.1 レンダリングエンジン」内に該当箇所があります。
2023.06.01
1刷 427
本文上から2行目
3刷
RenderEngineクラスは
RenderingEngineクラスは

※リフローEPUBの場合Chapter14「14.1」の「図41.1 複数の影」の
下の文章、2行目が該当箇所がです。
2023.06.01
1刷 455
「15.3 データの入力と出力」本文4行目と コード5行目と9行目
3刷
本文: 入力はscoreArray(点数の配列)という2つの引数で、 コード 5行目: for(int I = 0; I < numStudent; i++) 9行目: return totalScore / numStudent;
本文: 入力はscoreArray(点数の配列)という1つの引数で、 コード 5行目: for(int I = 0; I < NumStudent; i++) 9行目: return totalScore / NumStudent;

※リフローEPUBの場合Chapter15「15.3 データの入力と出力」が該当箇所です。
2023.06.01
1刷 455
「15.3 データの入力と出力」のコード 1行目
2刷
int CalcAvarage(int* scoreArray)
int CalcAverage(int* scoreArray)

「Avarage」(avarage)を「Average」(average)に修正します。

以下の箇所も同様に修正します。
・p456「15.5」の本文 下から3行目
・p457「15.6.1」のコード 6行目
・p459「15.6.1」のコード 下から8行目
・p462「15.6.2」のコード 6行目、下から3行目
----------------------
※リフローEPUBの場合、該当するコードは以下の通りです。
「15.5」の4つ目の段落「CalcAvarage()関数」
「15.6.1」のコード 6行目「float avarageScore; // 平均点」
「15.6.1」のコード 下から8行目「outputData->avarageScore,」
「15.6.2」のコード 6行目「float avarageScore; // 平均点」


2022.03.08
1刷 464
コード 下から5行目
3刷
outputData->avarageScore,
outputData->averageScore,

※リフローEPUBの場合、「15.7」の「step-4」のコードの下から5行目が該当箇所になります。
2022.05.24
1刷 466
「図15.5 スレッドを利用した処理」の矢印
3刷
24ミリ秒
14ミリ秒

※リフローEPUBの場合、Chapter15「15.9」の「15.9.1 スレッド」内に該当箇所があります。
2023.06.02
1刷 468
「15.9.3 SV_DispatchThreadID セマンティクス」の最終行
2刷
スレッドIDは(0, 0, 0) ~ (8, 6, 1)になるというわけです。
スレッドIDは(0, 0, 0) ~ (7, 5, 0)になるというわけです。
2022.03.08
1刷 489
「16.1.1 ポイントライトでLambert 拡散反射」のコード 「// 1.」と「// 2.」
3刷
// 1. 光源からサーフェイスに入射するベクトルを求める float ligDir = normalize(psIn.pos - pointLig.pos); // 2. 光源からサーフェイスまでの距離を求める float distance = length(psIn.pos - pointLig.pos);
// 1. 光源からサーフェイスに入射するベクトルを求める float ligDir = normalize(psIn.worldPos - pointLig.pos); // 2. 光源からサーフェイスまでの距離を求める float distance = length(psIn.worldPos - pointLig.pos);

※リフローEPUBの場合、Chapter16「16.1」の「16.1.2 ポイントライトを実装する」の上に記載しているコードが該当箇所です。
2023.06.02
1刷 492
「step-4 表示するモデルを初期化する(C++)」のコード
3刷
492.493ページに掲載しているコードを以下に差し替えます。
// step-4 表示するモデルを初期化する // ティーポットモデルを初期化 ModelInitData teapotModelInitData; // ユーザー拡張データとしてポイントライトのリストを渡す teapotModelInitData.m_expandConstantBuffer = pointLights; teapotModelInitData.m_expandConstantBufferSize = sizeof(pointLights); teapotModelInitData.m_tkmFilePath = "Assets/modelData/teapot.tkm"; teapotModelInitData.m_fxFilePath = "Assets/shader/model.fx"; Model teapotModel; teapotModel.Init(teapotModelInitData); // 背景のモデルを初期化 ModelInitData bgModelInitData; // ユーザー拡張データとしてポイントライトのリストを渡す bgModelInitData.m_expandConstantBuffer = pointLights; bgModelInitData.m_expandConstantBufferSize = sizeof(pointLights); bgModelInitData.m_tkmFilePath = "Assets/modelData/bg.tkm"; bgModelInitData.m_fxFilePath = "Assets/shader/model.fx"; Model bgModel; bgModel.Init(bgModelInitData);

※リフローEPUBの場合、Chapter16「16.1」の「16.1.2 ポイントライトを実装する」内に該当箇所があります。
2023.06.02
1刷 493
「step-6 モデルのドローコールを実行する(C++)」のコード
3刷
以下のコードに差し替えます。
// step-6 モデルのドローコールを実行する teapotModel.Draw(renderContext); bgModel.Draw(renderContext);

※リフローEPUBの場合Chapter16「16.1」の「16.1.2 ポイントライトを実装する」内に該当箇所があります。
2023.06.02
1刷 495
「step-9 ポイントライトの定数バッファーにアクセスするための変数を定義する(HLSL)」のコード 最終行 
3刷
}
};

※リフローEPUBの場合Chapter16「16.1」の「16.1.2 ポイントライトを実装する」内に該当箇所があります。
2023.06.02
1刷 522
「step-1 ZPrepassクラスを作成(C++)」のコード
3刷
522~523ページに掲載しているコードを以下に差し替えます。
// step-1 ZPrepass クラスを作成 class ZPrepass { private:      RenderTarget m_depthRT; // 深度値を書き込むレンダリングターゲット      Model m_teapotModel; // ティーポットのモデル      Model m_bgModel; // 背景モデル public:      RenderTarget& GetDepthRenderTarget()      {             return m_depthRT;      }      void Init()      {           // 深度値を書き込むレンダリングターゲットを作成           m_depthRT.Create(                  FRAME_BUFFER_W,                  FRAME_BUFFER_H,                  1,                  1,                  DXGI_FORMAT_R32_FLOAT,                  DXGI_FORMAT_D32_FLOAT           );           // モデルを初期化           ModelInitData teapotModelInitData;           teapotModelInitData.m_tkmFilePath = "Assets/modelData/teapot.tkm";           // シェーダーをZPrepass 用にする           teapotModelInitData.m_fxFilePath = "Assets/shader/zprepass.fx";           // 出力先のカラーバッファのフォーマットを指定する。           teapotModelInitData.m_colorBufferFormat[0] = DXGI_FORMAT_R32_FLOAT;           m_teapotModel.Init(teapotModelInitData);           // 背景のモデルを初期化           ModelInitData bgModelInitData;           bgModelInitData.m_tkmFilePath = "Assets/modelData/bg.tkm";           // シェーダーをZPrepass 用にする           bgModelInitData.m_fxFilePath = "Assets/shader/zprepass.fx";           // 出力先のカラーバッファのフォーマットを指定する。           bgModelInitData.m_colorBufferFormat[0] = DXGI_FORMAT_R32_FLOAT;           m_bgModel.Init(bgModelInitData);      }      void Draw(RenderContext& renderContext)      {             // レンダリングターゲットを切り替えてドロー             RenderTarget* rts[] = {                    &m_depthRT             };             renderContext.WaitUntilToPossibleSetRenderTargets(1, rts);             // レンダリングターゲットを設定               renderContext.SetRenderTargets(1, rts);             // レンダリングターゲットをクリア             renderContext.ClearRenderTargetViews(1, rts);             m_teapotModel.Draw(renderContext);             m_bgModel.Draw(renderContext);             // レンダリングターゲットへの書き込み待ち             renderContext.WaitUntilFinishDrawingToRenderTargets(1, rts);             // レンダリング先をフレームバッファに戻す             g_graphicsEngine->ChangeRenderTargetToFrameBuffer(renderContext);      } };

※リフローEPUB場合はChapter16「16.3」の「16.3.2 TBFR を実装する」内に該当箇所があります。
2023.06.02
1刷 532
「step-1 モデルをレイトレワールドに追加する(C++)」2つ目のグレーの枠内のコード
3刷
以下のコードに差し替えます。
// step-1 モデルをレイトレワールドに追加する // まずは普通にモデルをロードする ModelInitData modelInitData; modelInitData.m_tkmFilePath = "Assets/modelData/sample.tkm"; Model model; model.Init(modelInitData); // モデルをレイトレワールドに追加 g_graphicsEngine->RegistModelToRaytracingWorld(model);

※リフローEPUB場合はChapter17「17.3 レイトレーシング超入門」の3つ目のグレーの枠内のコードが該当箇所です。
2023.06.05
1刷 552
「17.6.1 Bottom Level Acceleration Structure(BLAS)」のNote 3~4行目
2刷
簡単にいうと「2分のデータ構造」になっています。
簡単にいうと「2分のデータ構造」になっています。
2022.03.08
2刷 297
「●step-12 ボケ画像書き込み用のピクセルシェーダーを実装(HLSL)」のコード 下から3行目
3刷
boke.a = min(1.0f, (depth - 800.0f) / 2000.0f);
boke.a = min(1.0f, (depth - 800.0f) / 1200.0f);

※リフローEPUBの場合Chapter10「10.6」の「10.6.3 被写界深度を実装する」内に該当箇所があります。
2023.06.01