2023年3月22日水曜日
DirectXTKのSpriteBatchで実際に自作のシェーダーを使うことができたのでその備忘録です。
ピクセルシェーダーにパラメータを渡すには頂点シェーダーも用意する必要があるそうなんですが、DirectXTKのSpriteBatchを使う場合はピクセルシェーダーを用意するだけで大丈夫でした。ということで、今回の記事に合わせてその2の記事に追記をしておきました。
追記したのは以下の内容です。
DirectXTKのSpriteBatchを利用している場合はピクセルシェーダーのエントリポイント(main関数)の引数を(float4 color : COLOR0, float2 tex_coord : TEXCOORD0)にすると(おそらくデフォルトで設定されている頂点シェーダー?の)パラメータを受け取ることができました。なのでその場合はピクセルシェーダーを用意するだけでOKです。
// イメージ( ^ω^)・・・ float4 main(float4 color : COLOR0, float2 tex_coord : TEXCOORD0) : SV_Target0{ float4 result = color; // ピクセルシェーダーでやりたい、なるべく簡単な処理 return result; }
ちなみに、設定するときはSpriteBatchのBegin関数にピクセルシェーダーを設定する関数をラムダ式で渡せばOKです。自分が実際に使っているコードは↓こんなイメージです。
void 描画(){ /* ■スプライトバッチ・COMオブジェクト(もろちんあらかじめ生成しておく必要がある) Microsoft::WRL::ComPtr<ID3D11DeviceContext> デバイスコンテキスト; std::unique_ptr<DirectX::SpriteBatch> スプライトバッチ; Microsoft::WRL::ComPtr<ID3D11BlendState> ブレンド; Microsoft::WRL::ComPtr<ID3D11PixelShader> ピクセルシェーダー; Microsoft::WRL::ComPtr<ID3D11Buffer> ピクセルシェーダーパラメータ; ■シェーダーを設定する関数 void シェーダー設定(){ デバイスコンテキスト->PSSetConstantBuffers(0U, 1U, ピクセルシェーダーパラメータ.GetAddressOf()); デバイスコンテキスト->PSSetShader(ピクセルシェーダー.Get(), NULL, 0); } */ スプライトバッチ->Begin(DirectX::SpriteSortMode_Deferred, ブレンド.Get(), nullptr, nullptr, nullptr, [=]()->void {シェーダー設定(); }); //Draw関数などいろいろ処理 スプライトバッチ->End(); }
クリップブレンドを作ったので、輝度を透明度に変換するシェーダーと合わせてやるといい感じの場面変換エフェクトになるんじゃないかと思います。
Live2Dとも組み合わせて動く場面変換も作れたらいいですな~~!ということで、
■今週のゲーム制作:Live2Dの描画プログラム制作
フレームワークととにらめっこ頑張っていきますぞ~~!