actionScript書きの日記

アラフォーFlashデベロッパのブログ。actionscriptやobjective-cを経て、現在はUnity、Spine、AfterEffectsがメイン。

Unityのシェーダーにおけるプロパティアトリビュートに関して

例えば、あるテクスチャの計算を乗算にするか加算にするか、という設定をマテリアルから行いたい場合、トグルで選択できれば便利なのだが、どうやってマテリアル上にトグルのパラメータを表示するのか、という点がなかなか分からなかった。

以下のリンクを大いに参考にさせていただいた。感謝申し上げる。

artawa.hatenablog.com

この値で上手く分岐ができれば、もう少し表現の幅が広がるなあ、と。

画像をタイリングした際に繰り返し表示するか否かの設定

画像をタイルのように敷き詰めたいときもあれば、繰り返したくないこともあるわけだが、この設定をどこでするのか、シェーダー関連の検索を色々としていたのだが、テクスチャ側の「Wrap Mode」をClampにすることで繰り返しをしないようにできた。単純だが、なかなかたどり着けなかったので、備忘録として。

UnityのURPシェーダーでUVスクロールする際のオフセットの取り扱い

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);

こんな感じのイメージ。

いちおうこれでスクロールしてくれるのだが、果たしてこれは正しい書き方なのだろうか??

本件に関しては、以下の記事に大いに助けていただいた。感謝申し上げる。

matcha-choco010.net

 

Unityで知らなかったショートカット二点

  • Alt + 左クリック→現在のシーンビューの中心点を基準として視点が回転。
  • Alt + 右クリック→シーンビューのカメラ画角の拡大縮小。

全然知らなかったので、備忘録として。

以下の記事に助けていただいた。感謝申し上げる。

learn.unity.com

MacBookPro(2023 M2 14インチ)の外部モニタ接続について

技術的な問題ではないのだが、環境面での話ってことで。

もともとは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のURP環境でMutliPassのシェーダーが機能しなかった件

前提

Unity 2021.3.9f1において、URP環境でMultiPassのUnlitシェーダーを作成しても、最初のパスしか実行されなかった。

 

対応

1つ目のパスに以下を追加。

Tags{ "LightMode" = "UniversalForward"}

これにより、MultiPassが機能するようになった。

以下の記事に助けられた。感謝申し上げる。

redhologerbera.hatenablog.com

Unityで動的にMeshの頂点数を増やしたらメッシュが縮小されてしまった件

前提

UnityのScriptで動的にMeshを生成し、SetVerticesとSetTrianglesを使用して頂点数を変更する処理を作成した。試しに縦横500ずつ頂点を作成すると、Meshの大きさが突然小さくなるという現象が発生した。頂点数をある程度減らすと解決した。

 

対応

デフォルトでUnityのMeshの頂点数が65535となっているため、それを超えた頂点は描画されないようである。今回のケースだと500×500で250000個の頂点が発生するので、この上限に引っかかってしまっている。

そのため、以下の処理を入れて、Meshの上限数を増やして描画をしたら解決した。

Mesh mesh = new Mesh();
mesh.indexFormat = UnityEngine.Rendering.IndexFormat.UInt32;

 

以下の記事に助けていただいた。感謝申し上げる。

inoookov.hatenablog.com