boxerprogrammer / directx12_samples Goto Github PK
View Code? Open in Web Editor NEW書籍「DirectX12の魔導書」のサンプルプログラム
License: MIT License
書籍「DirectX12の魔導書」のサンプルプログラム
License: MIT License
ほとんどのメンバ関数名が動詞から始まっているのに,一部のメンバ関数が動詞から始まっていません.
例えば,RecursiveMatrixMultiplyは,MultiplyMatrixRecursivelyなどの方が良いかもしれません.
本文でもRecursiveMatrixMultiplyとしているので,サンプルコードを変更するとすれば,第二版以降向けになると思います.
来週より編集部からプルリクを出していきたいと思いますので、都度ご確認いただければと存じます。
D3D12_DESCRIPTOR_RANGE descTblRange[1] = {}; // テクスチャと定数の2つ
コメントと実際の要素数が合っていません.また,6章から7章に移るにあたって,descTblRangeを変更する,という説明が抜けているようです.
そのままでも動くので,8章で再びルートシグネチャ周りを更新する際にズレが発生して,混乱するかもしれません.
11章までのシェーダはBasicVSとBasicPSが別ファイルに分かれていたのに,Chapter11/BasicVertexShader.hlslにBasicPSが復活しています.
法線の部分もボーンの計算が抜けているようですが,こちらは意図的なものでしょうか?
554 _cmdList->SetGraphicsRootSignature(rootsignature);
555
556 _cmdList->IASetPrimitiveTopology(D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
557 _cmdList->IASetVertexBuffers(0, 1, &vbView);
558 _cmdList->IASetIndexBuffer(&ibView);
559
560 _cmdList->SetGraphicsRootSignature(rootsignature);
ご拝見したところ、
main.cppファイルで554行目と560行目は二回SetGraphicsRootSignatureを呼び出しましたが、
こちらは意図的なものでしょうか。
書籍には,Chapter10/motion.vmdと書いていますが,そういったファイルがありません.
そもそも,motion/motion.vmdの間違いだと思いますが,そちらにもファイルがありません.
Chapter 9からChapter 11までのクリアカラーのコードには,次のようなコメントがあります.
float clearColor[] = { 1.0f, 0.0f, 1.0f, 1.0f }; // 白色
章によって値は変わっているようですし,コメントは外しておいた方がよいと思います.
2章で行列に関するswizzlingについては解説していますが,float3などの場合が抜けていて,そのまま7章で使っています.
swizzlingというキーワードは検索の際にも利用することがあると思うので,紹介しておいた方が良い気がします.
フェンスのCompletedValueを待つ処理がChapter7のmain.cppのみwhileループになっているようです.
5.3ではBasicShaderHeader.hlsliとしていますが,サンプルコードではBasicType.hlsliとなっています.
タイトルの通りですが,Chapter 8ではアルファブレンドが無効な前提で解説されています.
Chapter 6を読んだ限りでは,アルファブレンドを有効にする,という記述は無いようです.
Chapter 5,7,8ではアルファブレンドは無効になっているようなので,修正漏れでしょうか?
書籍では,peraHeader.hlsliとなっていますが,サンプルコードではType.hlsiをインクルードしています.
旧3章を解体した影響で、章番号がずれているようです。
書籍では,構造体名をVMDMotionとしていますが,サンプルコードではVMDKeyFrameとなっています.同様に,書籍ではMotionとなっている構造体がサンプルコードではKeyFrameとなっています.
7.6 読み込んだ頂点データの描画,で点のデータを表示するのに変更点として,IASetPrimitiveTopologyのみ記載されていますが,パイプラインステートのPrimitiveTopologyTypeをD3D12_PRIMITIVE_TOPOLOGY_TYPE_POINTに変更しないと,PRIMITIVE_TOPLOGY_MISMATCH_PIPELINE_STATEという警告が出続けます.
この2つの違いについては,公式ドキュメントに書いてありました.
The primitive topology type. Note that the input-assembler primitive topology type (point, line, triangle, patch) is set within the PSO using the D3D12_PRIMITIVE_TOPOLOGY_TYPE enumeration. The primitive adjacency and ordering (line list, line strip, line strip with adjacency data, etc.) is set from within a command list using the ID3D12GraphicsCommandList::IASetPrimitiveTopology method.
unsigned int c = 0xff;
for(; it != data.end(); it += 4)
{
auto col = (c << 0xff) | (c << 16) | (c << 8) | c;
}
この部分ですが,c << 0xffは常に0になるので,意図したのはc << 24ではないでしょうか?
P494の三つ目のソースコードで、ハンドルのポインタをずらすのに、
D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAVを使っていますが、
D3D12_DESCRIPTOR_HEAP_TYPE_RTVではないのでしょうか?
今回はD3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAVと
D3D12_DESCRIPTOR_HEAP_TYPE_RTVのIncrementSizeが
同じですので、動作できたが。
https://github.com/boxerprogrammer/directx12_samples/blob/master/Chapter14/PeraPixelShader.hlsl
122行目で
if (i - no < 0)continue;
となっていますが、これだと深度がいくつであろうと、retColor[0]は縮小バッファのうち一番大きなもの、retColor[1]はその次に大きなものになるように思いました。
これは、おそらく意図とは違っていて、深度が深いほど縮小バッファのうち小さいものを選びたいのではないでしょうか。
if (i - no < 0)
{
uvOfst.y += uvSize.y;
uvSize *= 0.5f;
continue;
}
が意図に合うのではないかと思います。
理解が間違っていたらすみません。
サンプルコードでは,EDGE_FLGの行が削除されています.
HLSLにuint8が無いためと思われますが,BasicVSの方にもEDGE_FLGのセマンティクス名に対応するものが消えているので,第二版では何かしら調整しないと混乱を招きそうです.
directx12_samples/Chapter10/PMDActor.cpp
Lines 135 to 137 in 6947b40
emplace_back()でvectorにオブジェクトを追加しているのに一時オブジェクトを生成しているのは冗長。(書籍中の該当コードはp378)
__ (アンダースコア2つ)で始まる名前,_ の直後に大文字が来る名前,グローバル名前空間における _ で始まる名前は仕様でコンパイラの実装のために予約されているため,避けた方が良いです.
最初の実装から _dev などグローバル変数の目印として _ で始まる名前が使われています.
書籍の12.2.2では,_peraSRVHeap,という名前になっていますが,サンプルコードでは_peraRegisterHeap,となっています.
directx12_samples/Chapter8/main.cpp
Line 712 in 6947b40
書籍中(p312)では、PMDファイルから 0xff
のトゥーン番号を読み取った時、 toon/toon00.bmp
をトゥーンテクスチャとして利用するとあります。ですが現在の実装は、以下の2点の問題から不適切だと考えます。
pmdMaterials[i].toonIdx = 0xffの時、toonFileNameが toon256.bmpとなる
暗黙にint型に変換されることから、0xff + 1
をunsigned charの範囲にまるめて0とすることが出来ていません。明示的にunsigned charにキャストする必要があります。
そもそもtoon00.bmpというファイルが存在しない
本レポジトリ中にも、MikuMikuDance(x64)をDLする際に付属するトゥーンテクスチャにも、toon00.bmp
というファイルは存在しません。
本実装ではトゥーンテクスチャの読み込みに失敗した場合はダミーで生成したグレーグラデーションテクスチャを代わりに利用する実装になっているため、エラーになることはありませんが……
このIssueは、トゥーン番号に 0xff
を使用している巡音ルカ.bmpを読み込んだ際に発見しました。
directx12_samples/Chapter10/PMDActor.h
Line 102 in 6947b40
directx12_samples/Chapter10/PMDActor.h
Line 93 in 6947b40
一時オブジェクトが渡されることを想定している関数のシグネチャが参照渡しになっています。 VS2017.15.5以降、デフォルトで有効になっている/permissive-
オプションが有効な時、このコードは通りません。
const参照渡しに書き換えるべきです。
参考
https://docs.microsoft.com/ja-jp/cpp/build/reference/permissive-standards-conformance?view=vs-2019
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.