いんでぃーづ

ゲームいろいろ、いろいろ自由

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値としてあてると、
マテリアルを当てたオブジェクトの背後の不透明ピクセルがそのまま取得できるということになります。

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


“Unity” and Unity logos are trademarks or registered trademarks of Unity Technologies or its affiliates in the U.S. and elsewhere, and are used under license.


免責事項

当サイトの広告バナー、リンクによって提供される情報、サービス内容について、当サイトは一切の責任を負いません。

また、当サイトの情報を元にユーザ様が不利益を被った場合にも、当サイトは一切の責任を負いません。

すべて自己責任でお願いします。