DirectX 12の魔導書 3Dレンダリングの基礎からMMDモデルを踊らせるまで(川野 竜一)|翔泳社の本
  1. ホーム >
  2. 書籍 >
  3. DirectX 12の魔導書 3Dレンダリングの基礎からMMDモデルを踊らせるまで

DirectX 12の魔導書 3Dレンダリングの基礎からMMDモデルを踊らせるまで


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

複雑なライブラリも、
一歩ずつ進めれば怖くない。

「DirectX 9~11に比べて超高機能/高性能だと聞いたけれど、
 複雑すぎて何をしているかわからない」

「ゲームエンジンのメンテナンスをするために、
 最新のDirectXの基礎を知りたい」

「フルスクラッチでMMDのモデルを
 表示/アニメーションさせてみたい」

そんなC++プログラマーに向けた、
DirectX 12の「導きの書」がついに登場!

◆3Dグラフィックスの基礎
◆グラフィックスパイプラインとステージ
◆PMDデータの読み込みと描画
◆VMDデータの読み込みとアニメーション再生
◆IK
◆ポストエフェクト

など、本当に知りたかった
DirectX 12プログラミングの基本がこの1冊に!!

DirectXは初めてという人も、
DirectX 9や10で止まってしまっている人も、
本書を心強い相棒にして、挑戦の旅へと出掛けましょう!

■Part 1 基礎理論編

Chapter 1 前提となる知識とDirectX 12の概略
 1.1 本書で使用するC++
 1.2 本書で使用する数学
 1.3 初歩的なレンダリング理論
 1.4 ハードウェアの基礎知識
 1.5 DirectXの歴史と変化

Chapter 2 グラフィックスパイプラインとさまざまなシェーダー
 2.1 グラフィックスパイプラインとは
 2.2 シェーダーとは

■Part 2 実践編(1)

Chapter 3 初期化から画面クリアまで
 3.1 最初のプロジェクト
 3.2 ウィンドウ表示とDirect3Dの初期化
 3.3 画面色のクリア
 3.4 エラー対応

Chapter 4 ポリゴンの表示
 4.1 グラフィックスパイプラインのおさらい
 4.2 頂点情報の作成
 4.3 頂点バッファー
 4.4 頂点情報のコピー(マップ)
 4.5 はじめてのシェーダー
 4.6 シェーダーの読み込みと生成
 4.7 頂点レイアウト
 4.8 グラフィックスパイプラインステートの作成
 4.9 ルートシグネチャ
 4.10 ビューポートとシザー矩形
 4.11 三角形ポリゴンを四角形にしてみる

Chapter 5 ポリゴンにテクスチャを貼り付ける
 5.1 DirectX 12におけるテクスチャ
 5.2 頂点情報にuv情報を追加する
 5.3 シェーダーにuv情報を追加する
 5.4 テクスチャデータの作成
 5.5 テクスチャバッファー
 5.6 ID3D12Resource::WriteToSubresource()メソッドによるデータ転送
 5.7 シェーダーリソースビュー
 5.8 ルートシグネチャにスロットとテクスチャの関連を記述する
 5.9 描画時の設定
 5.10 ピクセルシェーダーのプログラムを変更
 5.11 画像ファイルを読み込んで表示する
 5.12 ID3D12GraphicsCommandList::CopyTextureRegion()メソッドによる転送
 5.13 d3dx12.h(CD3DX~)の導入

Chapter 6 行列による座標変換
 6.1 行列の基本
 6.2 定数バッファーとシェーダーからの利用
 6.3 行列を変更してみる(2D編)
 6.4 行列を用いて3D化してみる
 6.5 回転アニメーションさせてみよう

Chapter 7 PMDの読み込みとモデルの表示
 7.1 MMDのダウンロード
 7.2 PMDデータとは
 7.3 PMDにおける頂点データ
 7.4 PMDヘッダー構造体
 7.5 PMDの頂点構造体とレイアウトの準備
 7.6 読み込んだ頂点データの描画
 7.7 インデックスデータの読み込みと利用
 7.8 法線データの表示
 7.9 深度バッファーの導入
 7.10 ランバートの余弦則
 7.11 シェーダー側でランバートの余弦則を実装する
 7.12 法線ベクトルも回転させて正しい結果を得る

Chapter 8 マテリアル(材質)
 8.1 マテリアルとは
 8.2 PMDファイルからマテリアルデータを読み込む
 8.3 シェーダーへの転送と表示
 8.4 マテリアルに合わせてテクスチャを貼る
 8.5 テクスチャの有無に応じた処理
 8.6 他のモデルも試してみよう
 8.7 スペキュラとアンビエントの実装
 8.8 テクスチャファイルがTGAやDDSの場合
 8.9 トゥーンシェーディング

Chapter 9 リファクタリング
 9.1 便利なクラスや構造体・マクロ
 9.2 main.cppからApplicationクラスへ
 9.3 用途によって簡単な分類を行う
 9.4 結果としてのApplication.cpp

■Part 3 実践編(2)

Chapter 10 スキニングとアニメーション
 10.1 スキニング(スキンメッシュアニメーション)
 10.2 ボーン情報のロード
 10.3 ツリーの構築
 10.4 頂点シェーダーでボーン行列の配列を扱う
 10.5 ボーン行列バッファーの作成
 10.6 回転行列でモデルにポーズを付ける
 10.7 MMDのアニメーションデータ(VMDファイル)
 10.8 クォータニオンと回転行列
 10.9 VMDデータを読み込んでポーズを付ける
 10.10 VMDデータを使ったアニメーション
 10.11 ベジェ曲線補間と2つの近似法
 10.12 ベジェによるイーズインイーズアウトの実装

Chapter 11 インバースキネマティクス(IK)
 11.1 インバースキネマティクス(IK)とは
 11.2 余弦定理を用いた簡易的IK(間点が1つ)
 11.3 CCD-IK(間点が複数)
 11.4 2DにおけるCCD-IKの実装
 11.5 PMDにおけるCCD-IK
 11.6 その他VMDやIKの仕様を考慮する

Chapter 12 マルチパスレンダリング
 12.1 マルチパスレンダリングとは
 12.2 レンダリング先を変更しテクスチャとして利用する
 12.3 単純なポストエフェクト

Chapter 13 影行列とシャドウマップ
 13.1 シャドウ(影)とは
 13.2 影行列を用いた地面影
 13.3 シャドウマップの導入(マルチパスの応用)

■Part 4 応用編

Chapter 14 マルチレンダーターゲットとその応用
 14.1 ピクセルシェーダーの出力を複数にする(色・法線)
 14.2 色・法線情報によるディファードシェーディング
 14.3 高輝度成分抽出とブルーム(光のもれ)
 14.4 簡易的な被写界深度の実装

Chapter 15 スクリーンスペースアンビエントオクルージョン(SSAO)
 15.1 アンビエントオクルージョンとは
 15.2 数式から考えるアンビエントオクルージョン
 15.3 スクリーンスペースアンビエントオクルージョン(SSAO)の実装

■Part 5 ライブラリ編

Chapter 16 imguiの利用
 16.1 imguiとは
 16.2 imguiの組み込み
 16.3 imguiの活用例

Chapter 17 Effekseerライブラリの利用
 17.1 Effekseerとは
 17.2 Effekseerライブラリの取得と準備
 17.3 Effekseerライブラリの組み込み

Chapter 18 DirectXTKの利用(文字列表示)
 18.1 DirectXTKとは
 18.2 DirectXTK12の入手
 18.3 DirectXTKの組み込み
 18.4 フォントを指定して文字列を表示する
 18.5 文字セットの作成と日本語表示

付属データはこちら

会員特典はこちら

お問い合わせ

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

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

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

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

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

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

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

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

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

書籍の種類:

書籍の刷数:

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

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

最終更新日:2024年02月20日
発生刷 ページ数 書籍改訂刷 電子書籍訂正 内容 登録日
1刷 041
Note「Hull Shader ステージでは分割は行われない」1行目
4刷
実際に分割が行われないと
実際に分割が行われないこと

※リフローEPUB場合Chapter2の「2.1.2.グラフィックスパイプラインの各ステージ」内に該当箇所があります。
2024.02.14
1刷 048
上から2番目のコードの3行目および4行目
2刷
_31 _32 _33 _14 _41 _42 _43 _14
_31 _32 _33 _34 _41 _42 _43 _44

※リフローEPUBの場合、「2.2.3 HLSLの基本構文」の3つ目の小見出し「●行列」の4つ目のグレーの枠内が該当箇所になります。
2020.03.18
1刷 061
「main.cppの中身は、ひとまず次の内容をそのまま書いてください。」の下のコード 2行目
4刷
#include <Windows.h> の下に #include <tchar.h> を追加

※リフローEPUB場合Chapter3の「3.1最初のプロジェクト」内に該当箇所があります。
2024.02.20
1刷 066
1つ目のコード3行目
3刷
IDXGISwapchain4* _swapchain = nullptr;
IDXGISwapChain4* _swapchain = nullptr;

「chain4*」の「c」を大文字に変更します。

※リフローEPUBの場合、図3.3の後にある小見出し「●基本オブジェクトの生成」の最初のサンプルコードが該当箇所になります。
2020.05.29
1刷 078
本文下から2行目
2刷
第3引数、第4引数はnullptrでよいため、第2引数のDXGI_SWAP_CHAIN_DESC1について
第4引数、第5引数はnullptrでよいため、第3引数のDXGI_SWAP_CHAIN_DESC1について

※リフローEPUBの場合、「3.3.4 スワップチェーン」の3つ目のNote「DeviceなのになぜCommandQueue?」のすぐ下の段落が該当箇所になります。
2020.03.03
1刷 079
「●スワップチェーンの生成」3つ目のコード 下から1~7行目
3刷
result = _dxgiFactory->CreateSwapChainForHwnd(    _cmdQueue,    hwnd,    &swapchainDesc,    nullptr,    nullptr,    (IDXGISwapChain1**)&_swapchain);
result = _dxgiFactory->CreateSwapChainForHwnd(    _cmdQueue, hwnd,    &swapchainDesc, nullptr, nullptr, (IDXGISwapChain1**)&_swapchain); // 本来はQueryInterface などを用いて                        // IDXGISwapChain4* への変換チェックをするが、                        // ここではわかりやすさ重視のためキャストで対応

※リフローEPUBの場合、見出し「3.3.5 レンダーターゲットビュー(RTV)」の前にあるサンプルコードが該当箇所になります。
2022.02.21
1刷 083
3つ目のコード、1行目
2刷
std::vector<ID3D12Resouce*> _backBuffers(swcDesc.BufferCount);
std::vector<ID3D12Resource*> _backBuffers(swcDesc.BufferCount);

※リフローEPUBの場合、「3.3.5 レンダーターゲットビュー(RTV)」の5つ目の小見出し「●スワップチェーンのメモリとひも付ける」の2つ目のグレー枠内が該当箇所になります。
2020.03.18
1刷 121
見出し「エラーが起きた場合」の上に掲載しているコード 下から1行目
3刷
&_vsBlob, &errorBlob); // エラー時はerrorBlob にメッセージが入る
&_psBlob, &errorBlob); // エラー時はerrorBlob にメッセージが入る

※リフローEPUBの場合、「4.6.3 D3DCompileFromFile()関数」の1つ目の小見出し「●エラーが起きた場合」の上にあるグレー枠内が該当箇所になります。
2021.04.23
1刷 122
1つ目のコード 1~3行目
3刷
std::copy_n(errstr.data(),      errorBlob->GetBufferPointer(),      errorBlob->GetBufferSize());
std::copy_n((cher*)errorBlob->GetBufferPointer(),      errorBlob->GetBufferSize(),      errstr.begin());

※リフローEPUBの場合、「4.6.3 D3DCompileFromFile()関数」の1つ目の小見出し「●エラーが起きた場合」の1つ目のグレー枠内、「//データコピー」の下にある3行が該当箇所になります。
2021.05.14
1刷 136
2つ目、3つ目の箇条書き
3刷
・BlendOp:D3D12_BLEND_OP_ADD(加算) ・SrcBlend:D3D12_BLEND_ONE(描画元そのままの値) ・DestBlend:D3D12_BLEND_ONE(描画元そのままの値) 同様に、乗算合成は次のようになります。 ・BlendOp:D3D12_BLEND_OP_ADD(加算) ・SrcBlend:D3D12_BLEND_ZERO(使用しない) ・DestBlend:D3D12_BLEND_SRC_COLOR(描画元そのままの値
・BlendOp:D3D12_BLEND_OP_ADD(加算) ・SrcBlend:D3D12_BLEND_ONE(描画元の色) ・DestBlend:D3D12_BLEND_ONE(描画先の色) 同様に、乗算合成は次のようになります。 ・BlendOp:D3D12_BLEND_OP_ADD(加算) ・SrcBlend:D3D12_BLEND_ZERO(使用しない) ・DestBlend:D3D12_BLEND_SRC_COLOR(描画先の色×描画元の色)

※リフローEPUBの場合、「4.8.5 ブレンドステートの設定」の2つ目の小見出し「●ブレンドの係数」にある2つ目と3つ目の箇条書きが該当箇所になります。
2020.05.29
1刷 137
「4.8.6 入力レイアウトの設定」の「●InputLayout」2行目
3刷
(InputLayout:D3D12_INPUT_LAYOUT_DESC型)を設定していきましょう。
(InputLayout:D3D12_INPUT_ELEMENT_DESC型)を設定していきましょう。
2021.04.23
1刷 141
「D3D12_ROOT_SIGNATURE_DESCの設定」2つ目のソースコード 3行目
4刷
D3D12ROOT_SIGNATURE_FLAG_ALLOW_INPUT_ASSEMBLER_INPUT_LAYOUT;
D3D12_ROOT_SIGNATURE_FLAG_ALLOW_INPUT_ASSEMBLER_INPUT_LAYOUT;
2022.09.22
1刷 145
1つ目のコード直後
2刷
(内容の追加となります)
それから、次のようにビューポートとシザー矩形を設定します。 ==== _cmdList->RSSetViewports(1, &viewport); _cmdList->RSSetScissorRects(1, &scissorrect); ====

※リフローEPUBの場合、「4.10.3 描画命令」の2つ目のグレー枠のすぐ下が挿入箇所になります。
2020.02.25
1刷 146
2つ目のコード
2刷
return float4((float2(0, 1) + input.pos.xy) * 0.5f,1, 1)
return float4((float2(0, 1) + pos.xy) * 0.5f, 1, 1)

※リフローEPUBの場合、「4.10.3 描画命令」の1つ目の小見出し「●いろいろ試してみよう」の2つ目のグレー枠が該当箇所になります。
2020.03.18
1刷 159
コード最終行
2刷
std::vector texturedata(256*256);
std::vector<TexRGBA> texturedata(256*256);

※リフローEPUBの場合、「5.4テクスチャデータの作成」の1つ目のグレー枠内が該当箇所になります。
2020.03.02
1刷 164
「5.7.2 シェーダーリソースビューを作る」ソースコード 3行目
4刷
// テクスチャのフォーマット(今回はDXGI_FORMAT_R8G8B8A8_UINT)
// テクスチャのフォーマット(今回はDXGI_FORMAT_R8G8B8A8_UNORM)
2022.09.22
1刷 170
「5.9.1 ルートシグネチャの指定」に掲載のコード
3刷
_cmdList->SetGraphicsRootSignature(rootSignatureDesc);
_cmdList->SetGraphicsRootSignature(rootSignature);
2021.04.23
1刷 174
本文下から7行目
2刷
$(DXTEX_DIR)Desktop_2019_Win10\x64\Debug
$(DXTEX_DIR)\Bin\Desktop_2019_Win10\x64\Debug

※リフローEPUBの場合、「5.11.1 DirectXTexの準備」の最後から2つ目の段落が該当箇所になります。
2020.03.06
1刷 177
本文1行目
2刷
第1引数以外はミップレベルです。
第1引数はミップレベルです。

※リフローEPUBの場合、「5.11.2 画像ファイルのロード」の3つ目のNote「インターフェイス関連のエラーが出る場合」の下にあるグレー枠の下の段落が該当箇所になります。
2020.02.18
1刷 192
「d3dx12.hを使うと、これを以下のように書き直すことができます。」の下のコードについて
4刷
VisualStudio2019の更新が行われた際に、 一時オブジェクトのアドレスを渡すことがエラー扱いとなりました。 このため、 auto heapProp = CD3DX12_HEAP_PROPERTIES(...); auto heapDesc=CD3DX12_RESOURCE_DESC::Buffer(...); のように一時変数を入れて result=_dev->CreateCommittedResource( &heapProp, D3D12_HEAP_FLAG_NONE, &heapDesc, (以下省略) とするとコンパイルエラーがなくなります。

※リフローEPUBの場合、「5.13.2 d3dx12.hの利用例」の2つ目のグレー枠についての補足となります。
2021.04.21
1刷 198
「6.1.2 XMMATRIX構造体」直前の本文
3刷
特にDirectXでは、C++でXMMATRIX構造体(後述)を扱っているときには優先となり、HLSLで乗算する際には優先となります。注意しましょう。
特にDirectXでは、C++でXMMATRIX構造体(後述)を扱っているときには優先となり、HLSLで乗算する際には優先となります。注意しましょう。
2020.05.29
1刷 199
1つ目のNote
3刷
「HLSLは優先」 先述のようにシェーダー(HLSL)では優先のため順序が逆です。
「HLSLは優先」 先述のようにシェーダー(HLSL)では優先のため順序が逆です。

※リフローEPUBの場合、「6.1.2 XMMATRIX構造体」の2つ目のNoteが該当箇所になります。
2020.05.29
1刷 201
本文下から2行目末
2刷
ひとまず案マップの必要はないので
ひとまずアンマップの必要はないので

※リフローEPUBの場合、「6.2.2 マップによる定数のコピー」の冒頭が該当箇所になります。
2020.02.20
1刷 208
本文3行目(2つ目のコード直後)
2刷
ここまででルートシグネチャの
ルートパラメータが配列になったので、rootSignatureDesc.pParametersの指定も配列化に合わせて書き換えてください。ここまででルートシグネチャの

※リフローEPUBの場合、「6.2.5 頂点シェーダーからの定数バッファー(行列)の参照」の直前にある段落が該当箇所になります。
2020.03.18
1刷 208
4つ目のコード 1~2行目
2刷
// 定数バッファー cbuffer cbuff0 : register(b0)
cbuffer cbuff0 : register(b0) // 定数バッファー

※リフローEPUBの場合、「6.2.5 頂点シェーダーからの定数バッファー(行列)の参照」の2つ目のグレー枠が該当箇所になります。
2021.12.16
1刷 222
「6.4.6 コーディング」ソースコード1行目
4刷
MATRIX matrix = XMMatrixRotationY(XM_PIDIV4);
XMMATRIX matrix = XMMatrixRotationY(XM_PIDIV4);
2022.09.22
1刷 228
2段落目先頭行
2刷
先頭3バイトがシグネチャとして"pmd"という文字列になっているのです。
先頭3バイトがシグネチャとして"Pmd"という文字列になっているのです。

※リフローEPUBの場合、「7.4 PMDヘッダー構造体」の1つ目のグレー枠の下の段落が該当箇所になります。
2020.02.18
1刷 263
Note内2行目
2刷
ID3D11DeviceContext
ID3D12GraphicsCommandList

※リフローEPUBの場合、「8.3.1 マテリアル用バッファーの作成」のNote「無駄な領域を作らない方法」が該当箇所になります。
2020.02.25
1刷 264
「ディスクリプタヒープの作成」に掲載しているコード
4刷
ID3D12DescriptorHeap* materialDescHeap = nullptr; D3D12_DESCRIPTOR_HEAP_DESC matDescHeapDesc = {}; matDescHeapDesc.Flags =                    D3D12_DESCRIPTOR_HEAP_FLAG_SHADER_VISIBLE; matDescHeapDesc.NodeMask = 0; matDescHeapDesc.NumDescriptors = materialNum; // マテリアル数を指定 matDescHeapDesc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV; result = _dev->CreateDescriptorHeap(      &matDescHeapDesc, IID_PPV_ARGS(&materialDescHeap));
ID3D12DescriptorHeap* materialDescHeap = nullptr; D3D12_DESCRIPTOR_HEAP_DESC materialDescHeapDesc={}; materialDescHeapDesc.Flags=                    D3D12_DESCRIPTOR_HEAP_FLAG_SHADER_VISIBLE; materialDescHeapDesc.NodeMask=0; materialDescHeapDesc.NumDescriptors=materialNum; materialDescHeapDesc.Type=D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV; result=_dev->CreateDescriptorHeap(      &materialDescHeapDesc,IID_PPV_ARGS(&materialDescHeap));

コード内の「matDescHeapDesc」を「materialDescHeapDesc 」に修正します。
2023.01.25
1刷 271
「パス合成関数」ソースコード 下から3行目
4刷
auto folderPath = modelPath.substr(0,modelPath.rfind('/'));
auto folderPath = modelPath.substr(0,modelPath.rfind('/')+1);
2023.01.25
1刷 272
「Note /か\か」ソースコード下から3行目
4刷
auto folderPath = modelPath.substr(0, pathIndex);
auto folderPath = modelPath.substr(0, pathIndex+1);
2023.01.25
1刷 277
2つ目のソースコード 1行目
4刷
for (int i = 0; i < pmdMaterials.size(); ++i)
vector textureResources(materialNum); for (int i = 0; i < pmdMaterials.size(); ++i)
2023.01.25
1刷 279
1つ目のソースコード 1行目
4刷
auto inc = _dev->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV);
auto incSize = _dev->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV);
2023.01.25
1刷 295
最終行
4刷
ここまでできたら、読み込みモデルを初音ミク.metal.pmdに変更し、実行してみましょう。
ここまでできたら、読み込みモデルを"初音ミクmetal.pmd"に変更し、実行してみましょう。
2023.01.25
1刷 299
2つ目のソースコード
4刷
float2 sphereMapUV = input.vnormal.xy;
float2 sphereMapUV = input.vnormal.xy; sphereMapUV = (sphereMapUV+float2(1,-1))*float2(0.5,-0.5);
2023.01.25
1刷 300
コード5行目および6行目
2刷
normalUV (※2箇所)
いずれも sphereMapUV となります。

※リフローEPUBの場合、「8.7.1 アンビエントの実装」の図8.18の次にあるグレー枠内が該当箇所になります。
2020.03.02
1刷 301
1つ目のNote内のコード4行目および5行目
2刷
normalUV (※2箇所)
いずれも sphereMapUV となります。

※リフローEPUBの場合、「8.7.1 アンビエントの実装」の末尾にあるNote「うまくいかない場合」が該当箇所になります。
2021.12.16
1刷 301
1つ目および2つ目のコード、構造体内メンバー
2刷
XMMATRIX viewProj;
XMMATRIX view; XMMATRIX proj;

※リフローEPUBの場合、「8.7.2 スペキュラの実装」の1つ目と2つ目のグレー枠が該当箇所になります。
2020.03.02
1刷 302
2つ目のソースコード
4刷
output.ray = normalize(pos.xyz - eye);
pos = mul(world,pos); output.ray = normalize(pos.xyz - eye);
2023.01.25
1刷 302
1つ目のコード、構造体内メンバー
2刷
matrix viewproj;
matrix view; matrix proj;

※リフローEPUBの場合、「8.7.2 スペキュラの実装」の1つ目のNote「便利な機能」の下にあるグレー枠が該当箇所になります。
2020.03.02
1刷 303
最終行
4刷
ただ、このままだと真っ黒なので、以下のようディフューズ・スペキュラ・アンビエントを
ただ、このままだと真っ黒なので、以下のようにディフューズ ・スペキュラ・アンビエントを
2023.01.25
1刷 304
1つ目のコード、2行目
2刷
diffuse * diffuse
diffuseB * diffuse

※リフローEPUBの場合、図8.20の下にあるグレー枠が該当箇所になります。
2020.03.02
1刷 311
1つ目のソースコード 下から3行目
4刷
return *it;
return it->second;
2023.01.25
1刷 313
ソースコード 1行目
4刷
for(int i = 0; i < pmdMaterials.size(); **i)
vector toonResources(materialNum); for(int i = 0; i < pmdMaterials.size(); **i)
2023.01.25
1刷 314
1つ目のコード中のfor文
3刷
for (; it != data.end(); it += 4) {    auto col = (c << 0xff) | (c << 16) | (c << 8) | c;    std::fill(it, it+4, col);    --c; }
for (; it != data.end(); it += 4) { //RGBAが逆並びのためRGBマクロと0xff<<24を用いて表す    auto col = (0xff << 24) | RGB(c,c,c);    std::fill(it, it+4, col);    --c; }

※リフローEPUBの場合、「8.9.5 デフォルトグラデーションテクスチャの作成」の1つ目のグレー枠が該当箇所になります。
2020.09.25
1刷 327
1つ目のソースコード 6行目
4刷
// 定数[b0](マテリアル用)
// 定数[b1](マテリアル用)
2023.01.25
1刷 329
3つ目のコード
2刷
D3D12CreateDevice(tmpAdapter, l, IID_PPV_ARGS(&_dev));
D3D12CreateDevice(tmpAdapter, lv, IID_PPV_ARGS(&_dev));

※リフローEPUBの場合、「9.1.5 ComPtrテンプレートクラスを使ったリファクタリング」の3つ目のグレー枠が該当箇所になります。
2020.03.18
1刷 368
・表情(ブレンドシェイプ)のデータ:23 バイト
4刷
・表情(ブレンドシェイプ)のデータ数:4バイト整数型(符号なし)  ・表情(ブレンドシェイプ)のデータ:23 バイト
・表情(ブレンドシェイプ)のデータ数:4バイト整数型(符号なし) ・表情(ブレンドシェイプ)のデータ:23 バイト
2023.01.25
1刷 374
下から6行目
4刷
以降は各キーフレームにおけるモーションのデータ(もデータ)が入っています。
以降は各キーフレームにおけるモーションのデータが入っています。
2023.01.25
1刷 382
本文4~5行目
3刷
現在のフレーム名をもとに
現在のフレーム番号をもとに

※リフローEPUBの場合、「10.10.1 フレームごとにポーズを取らせる」の4つ目のグレー枠の下にある3つ目の段落が該当箇所になります。
2020.05.29
1刷 448
コード7行目
2刷
auto targetNode = _boneNodeAddressArray[ik.boneIdx];
auto targetNode = _boneNodeAddressArray[ik.targetIdx];

※リフローEPUBの場合、「11.5.8 IKボーンにルートと末端しかない場合」のグレー枠が該当箇所になります。
2020.03.18
1刷 449
本文 上から4行目
3刷
テータの構造上、
データの構造上、

※リフローEPUBの場合、図11.30の下、2つ目のグレー枠の下にある段落が該当箇所になります。
2020.05.25
1刷 464
図12.1 左側のオブジェクト
3刷
シェーダーリソースビュー(SRV)
レンダーターゲットビュー(RTV)
2020.05.29
1刷 484
図12.13 右上、右下、左下(全3箇所)
3刷
空欄部分に以下を追加します。
1/256
2020.05.29
1刷 494
上から3つ目に掲載しているコードの下から5行目
3刷
D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV);
D3D12_DESCRIPTOR_HEAP_TYPE_RTV);

※リフローEPUBの場合、図12.18の下、3つ目のグレー枠内が該当箇所になります。
2021.04.23
1刷 507
数式(2)
3刷
a(x − x0) + b(y − y0) + c(z − z0) + d = 0
a(x − x0) + b(y − y0) + c(z − z0) = 0

※リフローEPUBの場合、「13.2.1 モデルを地面につぶす」の数式(2)が該当箇所になります。
2020.05.29
1刷 589
4つ目のコード末尾
3刷
[ImGui::]
上記を削除します。

※リフローEPUBの場合、「16.2.2 imguiの初期化」の7つ目のグレー枠内が該当箇所になります。
2020.05.29
1刷 621
本文6行目と「Note Releaseビルドの場合」内(2箇所)
3刷
Bin\Desktop_2017_Win10\x64
Bin\Desktop_2019_Win10\x64

※リフローEPUBの場合、「18.2 DirectXTK12の入手」の囲み「Releaseビルドの場合」および、その上の段落が該当箇所になります。
2020.05.29
1刷 読者特典-84
Appendix 1(数学編)84ページ 1行目
2021.05.13