例えば、あるテクスチャの計算を乗算にするか加算にするか、という設定をマテリアルから行いたい場合、トグルで選択できれば便利なのだが、どうやってマテリアル上にトグルのパラメータを表示するのか、という点がなかなか分からなかった。
以下のリンクを大いに参考にさせていただいた。感謝申し上げる。
この値で上手く分岐ができれば、もう少し表現の幅が広がるなあ、と。
例えば、あるテクスチャの計算を乗算にするか加算にするか、という設定をマテリアルから行いたい場合、トグルで選択できれば便利なのだが、どうやってマテリアル上にトグルのパラメータを表示するのか、という点がなかなか分からなかった。
以下のリンクを大いに参考にさせていただいた。感謝申し上げる。
この値で上手く分岐ができれば、もう少し表現の幅が広がるなあ、と。
UnityのURPシェーダーでUVスクロールをする際にどのように記述するのかを調べてみると、以下のようなコードが出てきた。
float2 offset = float2(_Time.x, 0);
o.uv = TRANSFORM_TEX(v.uv + offset, _MainTex);
変数「offset」内に、時間経過に比例して増大する値を入れ、関数「TRANSFORM_TEX」を実行する際にoffsetの値をuvに加算することでスクロールを実現している。
このやり方自体は何ら間違ってはいないのだが、一点気になったことがある。それは関数「TRANSFORM_TEX」の処理内容に関してだ。
上記コードではテクスチャ画像として「_MainTex」を使用している。具体的には
sampler2D _MainTex;
float4 _MainTex_ST;
という形で変数が定義されている。
ここで変数「_MainTex_ST」の中身が「TRANSFORM_TEX」の実行内容に関連している。「_MainTex_ST」の型はfloat4なので「x, y, z, w」の4つのパラメータを持つが、この内「x, y」がタイリングの値を、「z, w」がX軸方向とY軸方向へのオフセットの値を示している。これは、このシェーダを適用したマテリアルのInspectorウィンドウに表示される「_MainTex」のパラメータと対応している。
つまり「_MainTex」のUVに関する値は「_MainTex_ST」に格納され、その値を元に「TRANSFORM_TEX」で処理が行われる、ということだ。とすれば、UVスクロールの処理も「_MainTex_ST」内の値に対して行われるべきではないのだろうか。
_MainTex_ST.z = _MainTex_ST.z + _Time.x;
o.uv = TRANSFORM_TEX(v.uv + offset, _MainTex);
こんな感じのイメージ。
いちおうこれでスクロールしてくれるのだが、果たしてこれは正しい書き方なのだろうか??
本件に関しては、以下の記事に大いに助けていただいた。感謝申し上げる。
全然知らなかったので、備忘録として。
以下の記事に助けていただいた。感謝申し上げる。
技術的な問題ではないのだが、環境面での話ってことで。
もともとはMac側のUSB-Cからモニタ側のDisplayPort端子につないでいたのだけれど、これだとスリープ復帰時にMacがモニタを認識せず、毎回ケーブルを繋ぎ直す必要がある。それで「Mac側のHDMI端子からモニタのDisplayPort端子に繋げば改善するのでは」と考えて、DisplayPort⇔HDMIの変換ケーブルを買ったのだが、「PC側のDisplayPort端子からモニタ側のHDMI端子への接続」しかできないらしい。「PC側のHDMIからモニタ側のDisplayPortにつないでも何も表示されない」とのこと。
この形の接続にはそれ用のケーブルが必要らしく、普通のDisplayPort⇔HDMIの変換ケーブルだと対応していないケースが多いらしい。
不勉強ながら知らなかった。つーことはおとなしくHDMI同士でつなげってか。でもモニタのデフォルトがDisplayPortなんで、今度はスリープ復帰時にモニタ側の外部入力をいちいちDisplayPortからHDMIに変更することになるんよなあ。
やっぱApple純正のモニタ買えってか?面倒くさいなあ。。。
PC側のHDMI端子からモニタ側のDisplayPortに接続するには、それ用のケーブルが必要。普通の「DisplayPort⇔HDMI」ケーブルだと非対応のケースがほとんど。
Unity 2021.3.9f1において、URP環境でMultiPassのUnlitシェーダーを作成しても、最初のパスしか実行されなかった。
1つ目のパスに以下を追加。
Tags{ "LightMode" = "UniversalForward"}
これにより、MultiPassが機能するようになった。
以下の記事に助けられた。感謝申し上げる。
UnityのScriptで動的にMeshを生成し、SetVerticesとSetTrianglesを使用して頂点数を変更する処理を作成した。試しに縦横500ずつ頂点を作成すると、Meshの大きさが突然小さくなるという現象が発生した。頂点数をある程度減らすと解決した。
デフォルトでUnityのMeshの頂点数が65535となっているため、それを超えた頂点は描画されないようである。今回のケースだと500×500で250000個の頂点が発生するので、この上限に引っかかってしまっている。
そのため、以下の処理を入れて、Meshの上限数を増やして描画をしたら解決した。
Mesh mesh = new Mesh();
mesh.indexFormat = UnityEngine.Rendering.IndexFormat.UInt32;
以下の記事に助けていただいた。感謝申し上げる。