本の執筆状況。

こんにちわ,Pocolです。
気になっている方もいるかと思うので,共有しておきましょう。

本の執筆状況ですが,昨年年始頃に仮脱稿を終えまして,出版に向け色々と調整を行っている状況です。
転職の兼ね合いもありまして,副業にあたる・あたらないとかの周りで少々問題がありましたが,それもクリア出来まして
皆様にきちんとしたものをお届けできるようクオリティアップの作業の真っ最中でございます。

来るべき時が来たら「本年度中に」アナウンス致しますので,もうしばらくお待ちいただければと思います。
豪華なレビューアによるきちんとした和書になると思いますので,是非ご期待頂ければと思います。

サンプルプログラムも公開予定ですが,こちらはVisual Studio 2019対応済みです。
公開方法は詳しく決まっておりませんが,サンプルプログラムと合わせて読むことで本が完結する作りになっておりますので,
ご購入前にはご検討頂ければと思います。
※プログラム行数がかなり多いため,書籍のページの都合上要所部分だけを抜粋して載せる仕組みになっていますので予めご注意してください。

また大事なことなのですが,自分は本の著者として実績が無いのと,専門書は部数が出ない。
…という背景事情がありまして,初版の冊数はそんなに多くありません。

そのため…
万一冊数が出てしまった場合は品薄のため買えないという状況が起こりえるのと,
逆に販売数が振るわなかった場合は,すぐに絶版になり二度と手に入れることが出来なくなる可能性がありえます。

特に前者よりも後者の絶版になる可能性の方が高いと思います。
確実に手に入れていただくためには,予約購入して頂くのが今のところ確実かと思います。
来るべきアナウンスがありましたら,早めにご決断して頂き,予約購入して頂くことをお勧めいたします。

ラスタライザーの効率性を測るシェーダ

“Optimizing the Graphics Pipeline with Compute”を見ていたら,ラスタライザーの効率性を表示するピクセルシェーダが載っていたので,忘れないようにメモしておこうかと思います。

float3 main() : SV_TARGET0
{
    bool inside = false;
    float2 barycentric = fbGetBarycentricLinearCenter(); //__XB_GetBarycentricCoords_Linear_Center();

    if (barycentric.x >= 0 && barycentric.y >= 0 && barycentric.x + barycentric.y <= 1)
        inside = true;

    uint2 insideBallot = fbBallot(inside); //__XB_Ballot64();
    uint  insideCount  = countbits(insideBallot.x) + countbits(insideBallot.y);
    float insidePrecent = insideCount * (1.0 / 64.0);
    return float3(1 - insidePercent, insidePercent, 0);
}

合っているどうか全くわからないけども,Shader Model 6.0以降で書くと次のような感じ???
SM6.0全然弄ってないから分からん。

float3 main(linear float3 barycentric : SV_Barycentrics) : SV_TARGET0
{
    bool inside = false;
    if (baryenctric.x >= 0 && barycentric.y >= 0 && barycentric.x + barycentric.y <= 1)
        inside = true;

    uint  insideCount  = WaveActiveCountBits(inside);
    float insidePercent = insideCount * (1.0 / 64.0);
    return float3(1 - insidePercent, insidePercent, 0);
}

たぶん,間違っていると思うので誰か正しいコード教えてください。

最近悩んでいること。

こんにちわ,Pocolです。

たまには日記っぽいことを書いてみようかと思います。
最近の悩みは,シェーダバリエーションの生成とシェーダのマルチプラットフォーム対応どうしようかな?ってことで悩んでいます。
仕事で使っているものは他の方が書いてくれたもので,特に問題なく使っています。
で,「プライベートで使う方はどうしようかな?」ってのが今回の悩みです。
仕事で使っているのと同じものを作るのが手間というのと,
#ifdefのオンパレードが死ぬほど嫌いなので,趣味のコーディングではそういった手法は使いたくないです。
ソースコードが汚くなる。

で,比較的に綺麗に書けたなぁっていうのが,fxファイル。
前職で有名な方もいまだに使っていたというのと,バンジーのスライドだったような気がするのですが,やっぱりfxっぽい記述できるようにしていたんですよね。あとunityもcgfxっぽい感じなので,「やっぱりfxファイルでいいんじゃないの?」って気がして,fxシステム欲しいなぁ・欲しいなぁと思って,ずっと放置していました。
ようやく仕事がひと段落付きそうなので,ちろっと作ってみました。
https://github.com/ProjectAsura/asfxc

あんまり,凝ったツールにすると面倒なので,シェーダの組み合わせだけをとりあえず作るようにしてみました。
組み合わせはxmlファイルで吐き出すので,あとで別ツールにかまして… みたいなことができます。…というかその目的で作っています。
あくまでも,バリエーション生成用のHLSLソースコードと,バリエーションの羅列を出力だけする簡単なツールです。
雑ですが,とりあえずバリエーション生成はこれで解決!

あと残ったのは,マルチプラットフォーム対応ですね。
会社ではHLSLcc使っているみたいなんですが,HLSLccのフラグに関するドキュメントっぽいものがあんまりなくて,ちと不親切。
で他にないかなぁ…って探していたら,ありました。
https://github.com/microsoft/ShaderConductor

Microsoftが作ってくれているみたいなのです。
Metalにも対応しているみたいなので,「あ、これでいいじゃん!」って思ったので,今のところこれで行こうと思います。
これで,マルチプラットフォーム対応も(ほぼ)問題ないです。

シェーダのワークフローは下図みたいな感じになります。

「ほぼ」と言ったのにはワケがって,それでまた悩み中です。
悩み解決の進展があったら,またなんか書こうとかと思います。

深度バイアスについて

お久しぶりです。Pocolです。
最近お仕事の関係で,たまたま他社さんのソースコードを観る機会があったのですが,そのソースコードのコメントに自分のホームページのURLが記載してありました。
で,見てみたら深度バイアスの説明している個所だったのですが…
「これ正確じゃないな…」と今更ながら気づいてしまったので,訂正を兼ねてここで説明することにします。

深度バイアスについては,”Real-Time Rendering Forth Edition”の7.5にまとめられています。

(さらに…)

私的メモ 8/2

<A3Dのバージョンアップ(予定)>
 APIの仕様変更
  ・DescriptorSetの廃止
  ・ブレンド周りの設計ミスの修正
  ・UnorderedAccessViewの追加・StorageViewの廃止
  ・ICommandListにSetConstantBuffer()を追加
  ・ICommandListにSetTextureView()を追加
  ・ICommandListにSetUnorderedAccessView()を追加。
  ・ShaderAPIをHLSLに統一
  ・独自シェーダバイナリの策定
  ・IShaderReflectionインタフェースの追加
  ・遅延リソース破棄の実装
  ・BufferDescとTextureDescのメンバーを変更。
  ・各コンソール用に継承コマンドリストを追加。
  ・シェーダコンバーターの作成
  ・MetalAPIのサポート
  ・リターンコード列挙体の追加
  ・サンプルを整備
  ・NX版Vulkanのサポート廃止

勉強メモ 2018/04/28

今日はVeachの論文のChapter.2の2.2までを見ました。
幾つか分からない(or忘れている)内容があるので,あとで確認するためにメモしておきます。

・ニュートン・コーツ法
・中点法
・台形法
・シンプソン法
・ガウスルジャンドル法
・テンソル積
・Bakhvalovの定理

そのうち…

会社で,大気散乱とレイマーチを用いたボリューム雲のプログラムを作りました。
時間頑張った割には,見た目がいまいちなので,
時間が出来たらもう一度勉強しなおして,調整かけたいなぁと思っています。