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

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


形式:
電子書籍
発売日:
ISBN:
9784798165936
価格:
5,060(本体4,600円+税10%)
カテゴリ:
プログラミング・開発
キーワード:
#プログラミング,#開発環境,#開発手法,#Web・アプリ開発
電子書籍

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

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

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

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

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

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

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

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

※本電子書籍は同名出版物を底本として作成しました。記載内容は印刷出版当時のものです。
※印刷出版再現のため電子書籍としては不要な情報を含んでいる場合があります。
※印刷出版とは異なる表記・表現の場合があります。予めご了承ください。
※プレビューにてお手持ちの電子端末での表示状態をご確認の上、商品をお買い求めください。

(翔泳社)

目次の登録はありません。

付属データはこちら

会員特典はこちら

お問い合わせ

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

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

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

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

追加情報はありません。

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

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

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

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

書籍の種類:

書籍の刷数:

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

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

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

※リフロー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行目
#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行目
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行目
// テクスチャのフォーマット(今回は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を使うと、これを以下のように書き直すことができます。」の下のコードについて
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行目
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
「ディスクリプタヒープの作成」に掲載しているコード
コード内の「matDescHeapDesc」を「materialDescHeapDesc 」に修正 正しくは以下の通り。 3行目から 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));
2023.01.25
1刷 271
「パス合成関数」ソースコード 下から3行目
auto folderPath = modelPath.substr(0,modelPath.rfind('/'));
auto folderPath = modelPath.substr(0,modelPath.rfind('/')+1);
2023.01.25
1刷 272
「Note /か\か」ソースコード下から3行目
auto folderPath = modelPath.substr(0, pathIndex);
auto folderPath = modelPath.substr(0, pathIndex+1);
2023.01.25
1刷 277
2つ目のソースコード 1行目
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行目
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
最終行
ここまでできたら、読み込みモデルを初音ミク.metal.pmdに変更し、実行してみましょう。
ここまでできたら、読み込みモデルを"初音ミクmetal.pmd"に変更し、実行してみましょう。
2023.01.25
1刷 299
2つ目のソースコード
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つ目のソースコード
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
最終行
ただ、このままだと真っ黒なので、以下のようディフューズ・スペキュラ・アンビエントを
ただ、このままだと真っ黒なので、以下のようにディフューズ ・スペキュラ・アンビエントを
2023.01.25
1刷 304
1つ目のコード、2行目
2刷
diffuse * diffuse
diffuseB * diffuse

※リフローEPUBの場合、図8.20の下にあるグレー枠が該当箇所になります。
2020.03.02
1刷 311
1つ目のソースコード 下から3行目
return *it;
return it->second;
2023.01.25
1刷 313
ソースコード 1行目
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行目
// 定数[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バイト整数型(符号なし)  ・表情(ブレンドシェイプ)のデータ:23 バイト
・表情(ブレンドシェイプ)のデータ数:4バイト整数型(符号なし) ・表情(ブレンドシェイプ)のデータ:23 バイト
2023.01.25
1刷 374
下から6行目
以降は各キーフレームにおけるモーションのデータ(もデータ)が入っています。
以降は各キーフレームにおけるモーションのデータが入っています。
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