またアホみたいなことを思いついてUnityでモザイクする方法を探していたら、
意外と簡単にできました。
・環境
Unity 2021.1
URP 11
Render Pipline の設定
メニューの Edit > Project Settings でプロジェクト設定を開き、
Quality を開きます。
Rendering に設定されているパイプラインアセットを選択し、インスペクタで中身を見ます。
Opaque Texture の項目にチェックを入れましょう。
Shader Graph アセットを作成する
プロジェクトウィンドウで右クリック
Create > Shader > Universal Render Pipeline > Unlit Shader Graph
ライティングはまず使用しないので Unlit で作りましょう。
アセットの名前は Mosaic とします。
Shader Graph のプロパティの追加
Texture2Dのプロパティを追加し、名前を _CameraOpaqueTexture とします。
この名前は固定でこれにする必要があります。
さらにモザイクの細かさを指定するパラメータを Vector2 型で追加しましょう。ここでは Tile としました。
ノードをつなぐ
下の図のようなノードを作ります。
_CameraOpaqueTexture の Node Setting で Expose のチェックを外しておきましょう。
マテリアルを作成
Project ウインドウでマテリアルを作成し、シェーダーに作成した Mosaic シェーダーを設定します。
また、Render Queue は Transparent を選択しましょう。
シーンにモザイク表面となる Panel を追加
シーンに3Dオブジェクトの Plane を配置します。
Cast Shadows は OFF にしておきましょう。
そして作成したマテリアルを設定します。
これで背景がモザイク表示になります。
Sphere オブジェクトにマテリアルをあてれば円形のモザイクに
なにが起きているのか
_CameraOpaqueTexture という名前でプロパティを追加してレンダーキューを Transparent にすると、
オパーク(不透明)オブジェクトのみをレンダリングされた結果の画面全体が
一枚のテクスチャとしてこのプロパティに渡ってきます。
このテクスチャに対して Screen Position をUV値としてあてると、
マテリアルを当てたオブジェクトの背後の不透明ピクセルがそのまま取得できるということになります。
のでそれをポスタライズすればモザイクになるよ。