Unity 2Dゲーム作成 備忘録

Unity(2019.4.15f1 → 2020.3.11f1)でつまづいたところをメモしていきます。

URP対応のモザイク・ぼかしシェーダー(2D / Sprite Renderer)

pya1234さんのモザイクシェーダーをChatGPTを使って、URP対応のシェーダーに修正しました。「経緯とかどうでもいい」という方は、目次でダウンロードをクリックしてください。

 

ことの経緯

私は今まで、冒頭でリンクさせていただいたpya1234さんのモザイクシェーダーを重宝させていただいてたのですが、URP対応のプロジェクトで利用しようとしたところ、エラーが出て使えなくなってしまいました。
これは困った…。
旧来のシェーダーで使えたGrabPassが、URPでは使えないことが原因なようです。

「URPに切り替えたことだし、前々から気になってたシェーダーグラフでモザイクシェーダー作っちゃう?(ウキウキ)」と思ったのですが、これがまた、話はそう簡単にはいかず…。
超ベーシックなモザイクシェーダーであれば、すぐに作れるのですが、pya1234さんのシェーダーのように、オブジェクト越しに見えるものすべてにモザイクをかけることができません。

そこからネット探索の旅に出た末、UI用のモザイクシェーダーの作り方を発見できたのですが、このシェーダーをSpriteRendererに使ってみたところ、うまく作動せず…(当たり前ですが)
ちなみに、Imageで使用すると、ちゃんと作動します。

その他、3D用モザイクシェーダーの作り方はたくさん発見できたのですが、3Dと2Dはまた少々異なるらしく、「そんな設定2Dにないんですけど?」という箇所が現れて頓挫。

そもそも、シェーダーの知識がそんなにない私がネットを探索したところで、探索範囲は限られており、「やはり素人の私には無理か…」と諦めかけたのですが、一縷の望みをかけてChatGPTにお願いすることにしてみました。

実は、pya1234さんのモザイクシェーダーがエラーを吐きまくった際、一番最初にChatGPTに修正依頼したのですが、何度やってもうまくいきませんでした。
なぜなら…私に知識が皆無だったからです。
今思えば、すごい漠然とした、ChatGPT頼みの修正依頼をしていました。
しかし、今の私は違う。
URPモザイクシェーダーを作り出すために色々調べたせいで、初めより知識が備わり、的確な修正依頼をChatGPTに出すことができるようになっていたのです。

そして…
無事!pya1234さんのモザイクシェーダーをURP対応シェーダーに修正することができました!
ChatGPT凄い!!!
いや〜、「もう諦めて旧来のシェーダーに戻すか?」と思ってたので、本当に嬉しいです。

ダウンロード


修正したURP対応のシェーダーは、↓からダウンロードできます。
※大元はpya1234さんのモザイクシェーダーです。(著作権などで)問題がありましたら、取り下げますので、コメントにてご一報ください。
※素人の私がChatGPTで修正したものですので、自己責任でご利用ください。
※このシェーダーに関する質問をされても、素人ですので、何も答えられないです。
※Unity2021.3.28では無事動いてます。

ちなみに、モザイクシェーダーあるあるの「モザイクのセルが長方形になる現象」にも対応してみました。モザイクのセルを正方形にできます。

使い方

  1. ダウンロードした「mosaicURP.shader」をプロジェクトのAssetにドラッグ&ドロップする。

  2. Assetの「mosaicURP.shader」上で、右クリック > 作成 > マテリアルで、マテリアルを作成する。



  3. 「Pya_mosaicURP」というマテリアルが作成されるので、モザイクフィルター化したい2Dオブジェクトのマテリアルに設定する。

    下の図の場合、オブジェクトAとオブジェクトBの手前に、オブジェクトCが配置されているのですが、オブジェクトCのマテリアルに「Pya_mosaicURP」が設定されていて、オブジェクトA・Bそれぞれと重なる部分がモザイクになっています。


    ちなみに、「Pya_mosaicURP」を適用したオブジェクトのZ座標がカメラより手前になってしまうと、ゲーム実行時にモザイクが映らなくなるので、注意してください。(手取り早くモザイクオブジェクトを手前にしたくて、Z座標に大きめのマイナス値を入れるとそうなりがちです。)

  4. 「Pya_mosaicURP」のインスペクターで、モザイクのセルサイズ等を設定します。
    pya1234さんのDLページにも書かれていますが、こちらにもあらためて書いておきます。

    【Cull】
    詳しくないですが、2DだとOffでいいと思います。

    【Type】
    モザイクかブラー(ぼかし)かを選びます。4タイプから選べます。
    以下、pya1234さんのページから転記。
    ・モザイク1(mosaic1_normal) 
     普通のモザイク 
    ・モザイク2(mosaic2_average)
     色を平均化してモザイクを作る。1より色の再現度が高い。 
    ・ぼかし1(blur1_normal)
     周辺ピクセルの色を平均化する。
    ・ぼかし2(blur2_gauss)
     ガウス関数での重み付け。1より画像が平滑化される。


    【AspectRatio】
    モザイクのセルの正方形化に使います。
    作成しているゲームのアスペクト比を入れてください。
    (比率でなくても、そのまま入れても大丈夫です。例えば960×540で作っている場合、そのままX(横)に960、Y(縦)に540と入れて大丈夫です。)
    自動取得させたかったのですが、シェーダーでは本来取得できないらしいのと、代替手段について細々調べるのが面倒くさかったので、手入力にしました。
    長方形のままでいい方は、両方1を入れてください。作ってるゲームの画面比率のモザイクセルになります。(16:9で作っていれば、モザイクセルも16:9の長方形になります。)

    Mosaic
    「Type」でモザイクを選択した場合、ここでモザイクの大小を調節できます。

    Blur
    「Type」でブラー(ぼかし)を選んだ際、ブラーのかかり具合をここで調節します。

あらためて、モザイクシェーダーを作ってくださったpya1234さんに感謝です!
(あと、ChatGPTも!)