Siv3Dでシェーダ入門する

2019/04/06

 Siv3Dを使うといろいろ楽にできる。 シェーダも楽なんじゃないかと期待して触り始めた。

ソース

zxc / shader1 · GitLab

 今のところ、Siv3Dでシェーダを触る記事自体があまりないため、結局MicrosoftのリファレンスなりUnityのシェーダ使用例を参照することになる。
 したがって、調べるという点ではあまり楽だとは思わない。関数群のやっていることや使い方も良くわからないし。
 ただこれはある程度触って基本的な流れがわかってくると、なんとなくでもどういうことを中でしているか想像できるようになってくるんじゃなかろうか。
 使うという点ではすごく楽でいい。 ほかの環境でシェーダ使ったことはないが、シェーダファイルとシェーダ利用部分だけに注力しやすい。

scrapbox.io

 公式のsampleで一番楽なのはおそらくこれ。
ただコピペだけでは動かないかもしれない。
自分が動かすためにやったメモ。


 とりあえずMSVCの新規作成でHLSLのテンプレートは7つ出てくる設定にする。
設定を書き換えれば1つのテンプレートからどのシェーダファイルも作れるのだろうが面倒だ。

VisualStudio の HLSL テンプレートがおかしい
VisualStudio の HLSL テンプレートがおかしい その2


 あとはファイルを作ってコピペする。
シェーダファイル(.hlsl)のプロパティからエントリポイントとシェーダの種類がそれぞれ、PSとピクセルシェーダになっていることを確認する。 デフォルトではエントリポイントがmainらしいので書き換える。
その後、コンパイルしていつも通りにプロジェクトを実行する。
 シェーダが画面に反映されていないなら、PixelShader::isEmpty()でファイルが読み込めているか確認。
 Siv3DプロジェクトのExampleフォルダには、いくつかシェーダが入っているので、そこのシェーダで試すのも良いかもしれない。



 実際に触る。  Siv3Dのサンプルのwhite.hlslはピクセルシェーダだ。
ピクセルシェーダはレンダリングパイプラインの中で、比較的下流に位置するプログラマブルシェーダだ。
画面に表示される直前にピクセルの中身を制御する。らしい。
(したがって画面上の広い範囲に適用したいならなるべく重い処理を書かないほうが良い。その大きさ分、ピクセルシェーダで計算することになる。)

 このページがさっさと読めてわかりやすい。
【シェーダ】レンダリングパイプライン

 サンプルでは線形補完(?)というものをしている。
高校の数学の教科書で見たような下の式が関係している。

  \vec{x} = \alpha * \vec{v1} + (1-\alpha) * \vec{v2}

 三角形OABを考える。ここで
  
\vec{v1} = \vec{OA},\
\vec{v2} = \vec{OB},\
0 \leq \alpha \leq 1

とすると、\vec{x}は三角形の辺AB上の任意の点まで、点Oから伸びるベクトルになるはず。
 もっと簡単に言うと点Aと点Bの間を滑らかに変化する点Xを表現するのに使える。のだろう。

 この\alphaがsample中のstrength変数にあたる。



 コンスタントバッファはシェーダに渡す変数をまとめた構造体。 これをもっとうまく使えば、任意の色のみの画像と元の画像とを行き来するようなシェーダを一つのシェーダファイルで実現できるのだろう。

21.コンスタントバッファの作成 | gameproject

今回reversed1等、一切使っていないのだが必要なのだろうか。
EndPS関数等、まだ良くわからない。