FC2ブログ

Unityモザイクできました!!!!!!!!

Unity3D
06 /30 2015
2015/11/3 追記
モザイクがおかしくなる、また消える条件の詳細も記しておきます。
GOOD以下かつ、アス比が崩れた状態、つまり、16:9のモニタで4:3のフルスクリーンにする等にするとバグります。
完全に消えてしまうのは、その状態から、一旦デスクトップなどに移りUnityアプリを非アクティブにしてから、再度Unityアプリに戻るとモザイクが消えてしまいます。
私はとりあえずの対策として、GOOD以下を選択出来ないようにしました。

2015/9/19 追記
この方法では、Unityでの画質設定をGOOD以下にするとバグが起こることが分かりました。
症状としては、モザイクの軌跡が残る、ある操作をするとモザイクが消える、です。
ご注意ください。



sshot-2015-06-30-[13-33-39]

やっと出来た;;
どうしても塗り潰しはいやだったので
根性で無い頭しぼって、がんばって作りました。
といっても、0からごりごり書いたわけではなく・・・;
ネットに情報やソースコード公開してくれてる方々に
感謝致しますm(_ _)m


せっかくなので、メモ残しておきます。
日本語不自由でごめんなさい!
(ど素人のやり方なので、間違っている所あると思います!注意されたし)


~Unity5でモザイク入れてみたの巻~

まずは
オブジェクトを重なるように配置します
ひとつはなんでもないオブジェクト
もうひとつはモザイク用オブジェクト

モザイク用のマテリアルを作ります
新規にシェーダーとマテリアルを作る
それぞれ名前はMosaicとかでおk

シェーダーの中身には
http://d.hatena.ne.jp/nakamura001/20130205/1360083263
(ありがとうございます)
シェーダの全コード
を、まずコピペして
1行目の
"Unlit/Transparent"
ここを好きな名前にしておく
"Mosaic"とか。

 LOD 100

 ZWrite Off
の間に

 Stencil {
  Ref 2
  CompFront always
 CompBack always
 PassFront replace
 PassBack replace
 }


と追記する
ステンシルの2番目に書くよってことかな
詳細はこちら↓
http://tarowork.hatenablog.jp/entry/2014/07/27/193816
(ありがとうございます)

出来たシェーダーを先ほど新規で作ったマテリアルに付ける

完全に透過のテクスチャを用意する
32*32とか、小さくておk

マテリアルをオブジェクトに当てて、作ったテクスチャを貼る
モザイクオブジェクトの出来上がり
透明で何も写ってないけど大丈夫です
こういうの、マスクっていうのかな?

次に肝心のモザイク処理
↓から頂く
https://github.com/keijiro/unity-facecensor
(ありがとうございます)
中身のPixelationフォルダの
Pixelation.js
Pixelation.shader
PostEffectsBase.js
の3つだけ使うので移しておくといいかも

Pixelation.shaderを少し編集します

Pass {

ZTest Always Cull Off ZWrite Off
の間に

Stencil {
Ref 2
Comp equal
}


と追記する
モザイク処理もステンシルの2番目ねってこと

次はカメラの設定。

カメラは2台必要です
最初からある1台の子にもう1台カメラを作ります

メインカメラで全体を
子カメラでモザイクだけを描画って感じです

まずは
モザイクオブジェクト描画にレイヤーを使うので設定します
新規でレイヤーを作って、名前はMosaicとかわかりやすいのでおk
モザイク用オブジェクトのレイヤーをこれに変更します

メインカメラの設定
Culling Maskからモザイクレイヤーのチェックを外します
Depthは -1 ならおk

子カメラの設定
Clear FlagsをDon't Clearにします
Culling Maskをモザイクレイヤーだけチェックします
Depthはメインカメラより手前にしたいので、0でおk
ここに
Pixelation.js
をコンポーネント追加します(D&Dでおk)

これでほぼ完成!
Sceneウィンドウではわからないので
Gameウィンドウを見てみる
再生はしなくても確認できると思います

モザイクになってるけど、逆さまやん!
だと思います
ここからは力技?で解決しました
他のピクセルシェーダを入れると何故か直るのを利用して
Bloomを入れて
Intensityの値を0にするだけです
BloomとかはStandard Assetsに入ってます

以上、
無い脳汁しぼりきって作った、モザイクです
上手な人が見たら、こんな汚いやり方載せるな、とか言われそう・・・すいません

糸冬

コメント

非公開コメント

No title

情報提供ありがとうございます。
私も逆さまになるところまでは自力で修正できたのですが、そこから詰まってました。
カメラ2つは考えもしませんでした。

で、私も少し情報を・・・
ダミーで入れるBloomですがレンダリングコストが掛かるかもしれないので、
何もしない(入力ー>出力する)ダミーのImageEffectsスクリプトとシェーダーを作って
たいおうしました。

Re: No title

> 情報提供ありがとうございます。
> 私も逆さまになるところまでは自力で修正できたのですが、そこから詰まってました。
> カメラ2つは考えもしませんでした。
>
> で、私も少し情報を・・・
> ダミーで入れるBloomですがレンダリングコストが掛かるかもしれないので、
> 何もしない(入力ー>出力する)ダミーのImageEffectsスクリプトとシェーダーを作って
> たいおうしました。

ほんと稚拙な文章ですみません;お役に立てたなら幸いです
ダミーの件、私も試してみます!

うちは大丈夫みたいです

9.19の追記を見てビビってテストしましたが、ウチのは大丈夫みたいです。
Good以下の設定が私のプロジェクトセッティングと違うのかもしれませんね。

ただし、モザイクを適用したカメラを複数用意して切り替えるとハズれるみたいです。
ウチは、複数カメラの切り替えをやめて、1つのカメラを使いまわして、位置を瞬時に差し替えて
カメラ切り替えを実現する方法で解決しました。

あと、ウチだけかもしれませんが、透明オブジェクトがあるとモザイク部分とそいつが重なった時、
透明オブジェクトまでモザイクがかかってしまいます。これは、透明オブジェクトのシェーダー
(StandardのFadeとかLegacyのSoftEdghとか)がZWrite Offとなってるからだと思います。


Re: うちは大丈夫みたいです

> 9.19の追記を見てビビってテストしましたが、ウチのは大丈夫みたいです。
> Good以下の設定が私のプロジェクトセッティングと違うのかもしれませんね。
>
> ただし、モザイクを適用したカメラを複数用意して切り替えるとハズれるみたいです。
> ウチは、複数カメラの切り替えをやめて、1つのカメラを使いまわして、位置を瞬時に差し替えて
> カメラ切り替えを実現する方法で解決しました。
>
> あと、ウチだけかもしれませんが、透明オブジェクトがあるとモザイク部分とそいつが重なった時、
> 透明オブジェクトまでモザイクがかかってしまいます。これは、透明オブジェクトのシェーダー
> (StandardのFadeとかLegacyのSoftEdghとか)がZWrite Offとなってるからだと思います。

わざわざありがとうございます。
GOOD以下とだけ書いていましたが、他にも条件があります。
アス比が崩れた状態、つまり、16:9のモニタで4:3のフルスクリーンにするとバグります。
完全に取れてしまうのは、その状態から、一旦デスクトップなどに移りUnityアプリを非アクティブにしてから、再度Unityアプリに戻ると消えてしまいます。
これを書かなかったのは、他の方に迷惑かかるかなと思ったんですが。(裏技的になってしまう?)
でも情報は公開したほうが良かったですね。