以下の内容はhttps://indie-du.com/entry/2021/10/26/180243より取得しました。


Unity : URP + ShaderGraph でモザイク

またアホみたいなことを思いついてUnityでモザイクする方法を探していたら、
意外と簡単にできました。

f:id:sugar_affordance:20211026175722p:plain

・環境
Unity 2021.1
URP 11

Render Pipline の設定

メニューの Edit > Project Settings でプロジェクト設定を開き、
Quality を開きます。

Rendering に設定されているパイプラインアセットを選択し、インスペクタで中身を見ます。

f:id:sugar_affordance:20211026173447p:plain

Opaque Texture の項目にチェックを入れましょう。

f:id:sugar_affordance:20211026173552p:plain

Shader Graph アセットを作成する

プロジェクトウィンドウで右クリック

Create > Shader > Universal Render Pipeline > Unlit Shader Graph

f:id:sugar_affordance:20211026171013p:plain

ライティングはまず使用しないので Unlit で作りましょう。

アセットの名前は Mosaic とします。

Shader Graph のプロパティの追加

Texture2Dのプロパティを追加し、名前を _CameraOpaqueTexture とします。
この名前は固定でこれにする必要があります。

f:id:sugar_affordance:20211026172035p:plain

さらにモザイクの細かさを指定するパラメータを Vector2 型で追加しましょう。ここでは Tile としました。

f:id:sugar_affordance:20211026172225p:plain

ノードをつなぐ

下の図のようなノードを作ります。

f:id:sugar_affordance:20211026174058p:plain

_CameraOpaqueTexture の Node Setting で Expose のチェックを外しておきましょう。

f:id:sugar_affordance:20211026173901p:plain

マテリアルを作成

Project ウインドウでマテリアルを作成し、シェーダーに作成した Mosaic シェーダーを設定します。

f:id:sugar_affordance:20211026174348p:plain

また、Render Queue は Transparent を選択しましょう。

シーンにモザイク表面となる Panel を追加

シーンに3Dオブジェクトの Plane を配置します。

Cast Shadows は OFF にしておきましょう。

そして作成したマテリアルを設定します。

f:id:sugar_affordance:20211026173312p:plain

これで背景がモザイク表示になります。

f:id:sugar_affordance:20211026174747p:plain

Sphere オブジェクトにマテリアルをあてれば円形のモザイクに

f:id:sugar_affordance:20211026175722p:plain

なにが起きているのか

_CameraOpaqueTexture という名前でプロパティを追加してレンダーキューを Transparent にすると、
オパーク(不透明)オブジェクトのみをレンダリングされた結果の画面全体が
一枚のテクスチャとしてこのプロパティに渡ってきます。

このテクスチャに対して Screen Position をUV値としてあてると、
マテリアルを当てたオブジェクトの背後の不透明ピクセルがそのまま取得できるということになります。

のでそれをポスタライズすればモザイクになるよ。




以上の内容はhttps://indie-du.com/entry/2021/10/26/180243より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14