Matrix4x4ノードの任意の位置にある数値を取り出すサブグラフ

以前、スプライトをベイヤーディザで表示するシェーダーグラフを作ったのですが、ベイヤーマトリックスは単純な4×4の行列であるにも関わらず、行列の任意の位置にある数値を取り出す方法がわからなかったためMatrix4x4ノードが使えず、複雑な分岐の中にベイヤーパターンの値を忍ばせていました。

さてその後、サブグラフという概念を知り、“Matrix4x4ノードの任意の位置にある数値を取り出すサブグラフ”を作ることでベイヤーディザを行うシェーダーグラフ全体をスッキリと整理できました。というわけで、Matrix4x4ノードから、任意の位置にある数値を取り出すサブグラフをご紹介します。果たしてベイヤーディザ以外で用途があるのかわかりませんが……

Bayer-dithering ShaderGraph
上が以前のシェーダーグラフで……

Bayer-dithering ShaderGraph [improved]
下が今回ご紹介するサブグラフを使って改良したもの。上の画像のごちゃごちゃした部分がサブグラフで一つのノード(青く選択されているノード)にまとまって、やっている事は同じながら見た目はスッキリです。また、ベイヤーパターンの値もMatrix4x4ノードで直感的に記述できるようになりました(ちなみに、元々のスプライトの画素値のグレースケール化の部分もサブグラフにまとめました)

§

サブグラフ全体図

SubGraph: Extract a value at specific position from Matrix4x4

サブグラフ全体図はこんな感じです。Matrix4x4の値と、値を取り出したい位置を指定する行、列の数値で計3つの入力ラインがあります。出力は取り出した値一つです。

§

指定された行の取り出し

SubGraph: Extract a value at specific position from Matrix4x4 - First part

仕組みとしては、まずMatrix4x4をMatrix Splitノードで各行に分け、それをRow入力の値で分岐するBranchノードに繋げます。これでRow入力の値が0..3それぞれだった場合に、対応する行がVector4として取り出せます。
条件に当てはまらない場合は各チャンネルが0のベクトルになるので、全てをAddノードで加算すれば結果として必要な行の値のみ取り出せたことになります。なお、Row入力が整数とは限らないので、念の為最初にFloorノードを通しています。

§

指定された列の取り出し

SubGraph: Extract a value at specific position from Matrix4x4 - Last part

後半もまったく同様の要領で、今度はVector4の値からCol入力の値に対応するチャンネルの数値を取り出しています。最後に加算して、これでMatrix4x4から任意の位置にある数値が取り出せました!

§

というわけで、ベイヤーディザの閾値を取り出す以外にどんな用途があるかわかりませんが、Matrix4x4から任意の位置にある数値を取り出すサブグラフのご紹介でした。

コメントを残す

メールアドレスが公開されることはありませんし、空欄で大丈夫です。っていうかコメント以外空欄で良いです。気軽にコメントして下さい。
Email won't be published. Or you can leave it blank. I mean you can leave everything blank but comment. Feel free to leave a comment, thanks.