以下の内容はhttps://hakonebox.hatenablog.com/entry/2024/10/19/020852より取得しました。


DirectX12の魔導書を読んだ。それと躓いたところ

はじめに

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モデルを表示するところまで終えた。

要望




以上の内容はhttps://hakonebox.hatenablog.com/entry/2024/10/19/020852より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14