はじめに
DirectX12の魔導書を進めています。
(育休のお供に始めたのですが育休終了までに終わる気しないです。そもそも育児が大変)
2024年にAmazonで購入したのですが、第1版(初版)が届き誤記されている文章に結構苦労しています。
(仕方がない。本屋で印刷日を確認して購入すればよかった。重かったのよ。)
タイポくらいなら気づけるのですが、そもそも記載漏れだと気付きにくいので大変...
ここに書いてある内容も誤記表を見れば書いてあるのでそちらを...。
www.shoeisha.co.jp
まだ写経中なのでまた何かあれば追記予定
躓いたところ
4.5はじめてのシェーダー
.hlslファイルを作成した後、テキスト上はエントリポイント名とシェーダーモデルの変更について記載があるが、
シェーダーの種類も合わせて変更する。(7.8で困ったのでここに記載しておく)
4.10.3 描画命令
ビューポートとシザー矩形の設定が抜けていた。
_cmdList->RSSetViewports(1, &viewport); _cmdList->RSSetScissorRects(1, &scissorrect);
誤記表に記載があったが、そもそも説明抜けだったので気が付かなかった。
viewportとscissorrectの設定内容の説明はあったが、これらが反映されていないことに疑問を持てれば気づけたと思う。ちょっとくやしい。
いろいろためしてみよう
テキスト記載のコードでうまくいかない→誤記を確認→誤記があったのでので下で試した→白色のまま色が変わらなかった。
return float4((float2(0, 1) + pos.xy) * 0.5f, 1, 1)
hlslでのデバッグの方法がわからなかったので無理やり下記のコードで検証した。
このコードで三角形は緑に染まったのでpos.xの値は-1~1に収まっていないようだった。
float4 BasicPS(float4 pos : SV_Position) : SV_TARGET { if (pos.x >= -1.0 && pos.x <= 1.0) { return float4(1, 0, 0, 1); } else { return float4(0, 1, 0, 1); } }
おそらく1より大きい値が入るせいで白になっていたと思われる。
(環境によって変わる?)
サンプルコードを見てみると4章時点ではこのコードになってなさそう? https://github.com/boxerprogrammer/directx12_samples/blob/master/Chapter4/BasicPixelShader.hlsl
とりあえずposの値の範囲がわからないので雑に割っておくことにした。
(グラデーションが見れたのでいったん良しとする。)
float4 BasicPS(float4 pos : SV_Position) : SV_TARGET { // 255で割ったらグラデーションになった。-1~1の値がきていないようだ return float4((float2(0, 1) + pos.xy) / 512, 1, 1); }

5.3 シェーダーにuv情報を追加する
float4 BasicPS(Output input)
サンプルコードを見てみるとそもそも頂点シェーダとピクセルシェーダのやり取りを行う構造体を書くヘッダーファイル周りの命名が全然違う。
誤記表には特に記載なし。
この本でこんな感じでサンプルコードは変わってることはよくある(気がする。)
名前だけで動きは変わらないので今のうちにサンプルコードに合わせておくことにする。
5.9.1 ルートシグネチャの指定
誤記があり、下記が正しいとのこと。
_cmdList->SetGraphicsRootSignature(rootSignature);
とはいえrootSignatureはまだ定義していないもの。(rootsignatureは作成済み)
サンプルコードを見るとrootsignatureが正しそう。
誤記表に記載されているものが誤記?
_cmdList->SetGraphicsRootSignature(rootsignature); _cmdList->SetDescriptorHeaps(1, &texDescHeap); _cmdList->SetGraphicsRootDescriptorTable(0, texDescHeap->GetGPUDescriptorHandleForHeapStart());
(あとサンプルコードにルートシグネチャの指定が2か所記載されているのはどういう意図なんでしょう..)
5.12 ID3D12GraphicsCommandList::CopyTextureRefion()メソッドによる転送
読み飛ばすことにした。
(写経tX12の魔導書を進めています。
(育休のお供に始めたのですが育休終了までに終わる気しないです。そもそも育児が大変)
2024年にAmazonで購入したのですが、第1版(初版)が届き誤記されている文章に結構苦労しています。
(仕方がない。本屋で印刷日を確認して購入すればよかった。重かったのよ。)
タイポくらいなら気づけるのですが、そもそも記載漏れだと気付きにくいので大変...
ここに書いてある内容も誤記表を見れば書いてあるのでそちらを...。
www.shoeisha.co.jp
まだ写経中なのでまた何かあれば追記予定
躓いたところ
4.10.3 描画命令
ビューポートとシザー矩形の設定が抜けていた。
_cmdList->RSSetViewports(1, &viewport); _cmdList->RSSetScissorRects(1, &scissorrect);
誤記表に記載があったが、そもそも説明抜けだったので気が付かなかった。
viewportとscissorrectの設定内容の説明はあったが、これらが反映されていないことに疑問を持てれば気づけたと思う。ちょっとくやしい。
いろいろためしてみよう
テキスト記載のコードでうまくいかない→誤記を確認→誤記があったのでので下で試した→白色のまま色が変わらなかった。
return float4((float2(0, 1) + pos.xy) * 0.5f, 1, 1)
hlslでのデバッグの方法がわからなかったので無理やり下記のコードで検証した。
このコードで三角形は緑に染まったのでpos.xの値は-1~1に収まっていないようだった。
float4 BasicPS(float4 pos : SV_Position) : SV_TARGET { if (pos.x >= -1.0 && pos.x <= 1.0) { return float4(1, 0, 0, 1); } else { return float4(0, 1, 0, 1); } }
おそらく1より大きい値が入るせいで白になっていたと思われる。
(環境によって変わる?)
サンプルコードを見てみると4章時点ではこのコードになってなさそう? https://github.com/boxerprogrammer/directx12_samples/blob/master/Chapter4/BasicPixelShader.hlsl
とりあえずposの値の範囲がわからないので雑に割っておくことにした。
(グラデーションが見れたのでいったん良しとする。)
float4 BasicPS(float4 pos : SV_Position) : SV_TARGET { // 255で割ったらグラデーションになった。-1~1の値がきていないようだ return float4((float2(0, 1) + pos.xy) / 512, 1, 1); }

5.3 シェーダーにuv情報を追加する
float4 BasicPS(Output input)
サンプルコードを見てみるとそもそも頂点シェーダとピクセルシェーダのやり取りを行う構造体を書くヘッダーファイル周りの命名が全然違う。
誤記表には特に記載なし。
この本でこんな感じでサンプルコードは変わってることはよくある(気がする。)
名前だけで動きは変わらないので今のうちにサンプルコードに合わせておくことにする。
5.9.1 ルートシグネチャの指定
誤記があり、下記が正しいとのこと。
_cmdList->SetGraphicsRootSignature(rootSignature);
とはいえrootSignatureはまだ定義していないもの。(rootsignatureは作成済み)
サンプルコードを見るとrootsignatureが正しそう。
誤記表に記載されているものが誤記?
_cmdList->SetGraphicsRootSignature(rootsignature); _cmdList->SetDescriptorHeaps(1, &texDescHeap); _cmdList->SetGraphicsRootDescriptorTable(0, texDescHeap->GetGPUDescriptorHandleForHeapStart());
(あとサンプルコードにルートシグネチャの指定が2か所記載されているのはどういう意図なんでしょう..)
5.12 ID3D12GraphicsCommandList::CopyTextureRefion()メソッドによる転送
読み飛ばすことにした。 (テキストにもテクスチャが表示に問題がなければ良しとあった。)
写経しようとしたが、しばらく泥沼にはまったので断念。
サンプルコードここみたい?(未確認)
https://github.com/boxerprogrammer/directx12_samples/tree/master/Chapter5_CopyTexture
5.13 d3dx12.h(CD3DX~)の導入
#include<d3dx12.h>とするだけでd3dx12.hが使えますねとあったが自分の環境ではうまくいかず..
DirectXTex.hのパス、hoge/microsoft\DirectXTex\DirectXTex\DirectXTex.hとは異なりhoge/microsoft\DirectXTex\Common\d3dx12.hにあった。
(本当はプロジェクト設定の追加インクルードからうまいこと追加したかったが、うまくいかなかったため)妥協して以下のようにした。
#include <DirectXTex/../../Common/d3dx12.h>
ついでにバリア設定をd3dx12に置き換えるやつ、これも誤記がありそう。
(一時オブジェクトのアドレスを渡すことがエラー扱い?)
さらに言うとバリア設定をPresetに変更するやつも併せてd3dx12に置き換えた。
6.2.4 ルートシグネチャの変更
コメントで定数用レジスタは0番とあって、誤記かと思ったが違うようだ。
レジスターの種類が違う場合、レジスタは別の場所にあり、明確に分けられているため、レジスタ番号は重複しても心配ない。
7.8 法線データの表示
頂点シェーダに法線ベクトルを追加したところ、以下のようなエラーが出た。
invalid vs_2_0 output semantic 'NORMAL'
シェーダーモデルは5.0になっていたので、違う原因かと思ったが、
シェーダーの種類のところが空白になっていたのが原因のようだった。
下記のように頂点シェーダと設定して解決。
(今まで記載せずに動いていたのは何だったのか...未記入だと適当に動いてくれていたのか...正しく動いていなかったのか...)

8.3.4 マテリアル用ルートパラメータへの設定追加
レンジの設定でdescTBLRange[1]に対して設定しているが、
すでに0,1にはテクスチャと定数で設定されている。
→いろいろやった hakonebox.hatenablog.com
8.9.6 トゥーンテクスチャ用のビューの作成
トゥーン対応を行った後、"さらにレンジの数を増やして'とテキストにある。 テキスト中では
descTblRange[2].NumDescriptors = 4;
と
auto cbvsrvIncSize = _dev->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV) * 5
のみ書かれているが、このままだとエラーになる。
マテリアルディスクリプタヒープでの設定の値も修正する必要があった。
materialDescHeapDesc.NumDescriptors = materialNum * 5
その他細かいところ
誤記表の間違い
正 vector textureResources(materialNum); for (int i = 0; i < pmdMaterials.size(); ++i)
とあるが、
vector<ID3D12Resource*> textureResources(materialNum);
と書く必要がある。誤記表は更新してほしい。
自分が気づかないだけでたくさんあると思う。
自分がやった誤字(戒め)
数値の入力ミス
5章のノイズテクスチャの段階で下記のように表示されていた。
画面サイズやRGBAの定義が間違えているのかと思い、長いこと探したが、ただの誤入力だった...
↓のインデックス3のuv座標が{1.0f,0.0f}にできていなかっただけ。
Vertex vertices[] =
{
{{-0.4f,-0.7f,0.0f},{0.0f,1.0f} },//左下 インデックス:0
{{-0.4f,0.7f,0.0f},{0.0f,0.0f}} ,//左上 インデックス:1
{{0.4f,-0.7f,0.0f},{1.0f,1.0f}} ,//右下 インデックス:2
{{0.4f,0.7f,0.0f},{1.0f,1.0f}} ,//右上 インデックス:3
};
テクスチャデータの作成前のuv値を色として表示するときの時点で間違ってた。 (テキスト白黒だから、間違っていたことに気づきにくかったと思う。)
ログ
7章終わり
24/11/12 やっとpmdモデルを表示するところまで終えた。
