###前提・実現したいこと
ここに質問したいことを詳細
RenderTextureを使ってカメラで撮影したエフェクト(Particle System)をCanvasの配下にあるRawImageに投影させようとしているのですが、どうもカメラの背景(例えば、カメラの設定でSolid Colorで黒を指定している場合は背景の黒と移しているエフェクト)が映りこんでしまいます。こちらをalphaを0にすると今度は何も映らなくなってしまい、どうしたら良いか困っています。
*どうやらParticle Systemを再生させる場合はCanvasが必要そうです。
RenderTextureで無理やりやろうとすると必ずMeshRendererが背後にないと映りません。
結論、無理ということになりました。
もし、それでも可能だという場合があればご教授頂けますと幸いです。
■Unity version
5.5.2 p1
###試したこと
###補足情報(言語/FW/ツール等のバージョンなど)
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
回答1件
0
ベストアンサー
バージョン5.6.1f1でテストしましたが、おそらくご質問者さんのバージョンでも大きな違いはないかと思います。
- シーン内にメインカメラ、パーティクル用カメラ、パーティクルシステム、背景してモデル2つと地面の平面を配置
- パーティクル用のカメラはクリアフラグをSolidColor、背景色をARGBすべて0として、ターゲットテクスチャをRenderTexture(名前はParticle Texture)に設定
- Particle TextureのカラーフォーマットはデフォルトのARGB32のまま、サイズは256だと少々小さい気がしたので512ピクセル四方に設定
- RawImageを画面の中央に配置しParticle Textureを参照、サイズを同じく512ピクセル四方に設定
これで動かすと、確かにご質問者さんのおっしゃるように、テクスチャの不透明部分にしかパーティクルが描画されず、いまいちでした。
どうやらパーティクルシステムのデフォルトのシェーダーの動作が原因のようで、パーティクル描画時にアルファ成分を書き換えていないために、透明な部分はそのまま透明になってしまうようです。
新しくシェーダーを作成して、ダウンロードアーカイブにあるビルトインシェーダーをダウンロードし、新しいシェーダーの中身を丸々DefaultResourcesExtraの中のParticle Premultiply Blend.shaderの内容で置き換えたのち、シェーダー名を適当に変え、ColorMaskをRGBAにしてアルファチャンネルにも書き込みを行うようにしました。
ShaderLab
1Shader "Particles/Alpha Blended Premultiply (RGBA)" { // ビルトインシェーダーと区別がつくように名前を変更 2 Properties{ 3 _MainTex("Particle Texture", 2D) = "white" {} 4 _InvFade("Soft Particles Factor", Range(0.01,3.0)) = 1.0 5 } 6 7 Category{ 8 Tags{ "Queue" = "Transparent" "IgnoreProjector" = "True" "RenderType" = "Transparent" "PreviewType" = "Plane" } 9 Blend One OneMinusSrcAlpha 10 ColorMask RGBA // ここを「RGB」から「RGBA」に修正 11 Cull Off Lighting Off ZWrite Off 12 13 /* 中略 */ 14 } 15} 16
新しくマテリアルを作成し、Shaderを先ほど作ったParticles/Alpha Blended Premultiply (RGBA)に変え、Particle Textureはデフォルトと同じDefault-Particleに設定、このマテリアルをParticle SystemのRendererのMaterialにセットしました。
これでプレイモードにすると、透明部分にも描画されるようになったものの、透明部分に描画されたパーティクルに黒いフリンジが発生してしまいました。
これはアルファ乗算済みイメージをストレートアルファイメージのつもりで合成した時に現れる典型的な症状で(こちらのサイトなどがご参考になるでしょうか?)、今度はRawImageの方のマテリアルを修正する必要があります。
同じ要領でDefaultResourcesExtra/UIの中のUI-Default.shaderを丸写ししてシェーダーを作り、Blendを変更してアルファチャンネル乗算を行わないようにします。
ShaderLab
1Shader "UI/Straight Alpha" // こちらもやはり名前を変更 2{ 3 Properties 4 { 5 [PerRendererData] _MainTex("Sprite Texture", 2D) = "white" {} 6 _Color("Tint", Color) = (1,1,1,1) 7 8 _StencilComp("Stencil Comparison", Float) = 8 9 _Stencil("Stencil ID", Float) = 0 10 _StencilOp("Stencil Operation", Float) = 0 11 _StencilWriteMask("Stencil Write Mask", Float) = 255 12 _StencilReadMask("Stencil Read Mask", Float) = 255 13 14 _ColorMask("Color Mask", Float) = 15 15 16 [Toggle(UNITY_UI_ALPHACLIP)] _UseUIAlphaClip("Use Alpha Clip", Float) = 0 17 } 18 19 SubShader 20 { 21 Tags 22 { 23 "Queue" = "Transparent" 24 "IgnoreProjector" = "True" 25 "RenderType" = "Transparent" 26 "PreviewType" = "Plane" 27 "CanUseSpriteAtlas" = "True" 28 } 29 30 Stencil 31 { 32 Ref[_Stencil] 33 Comp[_StencilComp] 34 Pass[_StencilOp] 35 ReadMask[_StencilReadMask] 36 WriteMask[_StencilWriteMask] 37 } 38 39 Cull Off 40 Lighting Off 41 ZWrite Off 42 ZTest[unity_GUIZTestMode] 43 Blend One OneMinusSrcAlpha // ここを「Blend SrcAlpha OneMinusSrcAlpha」から「Blend One OneMinusSrcAlpha」に変更 44 ColorMask[_ColorMask] 45 46 /* 中略 */ 47 } 48}
新規マテリアルにこのシェーダーをセットし、RawImageのRaw Image (Script)のMaterialにそのマテリアルをセットします。
これで描画するとフリンジが消えました。
パーティクルシステムを単独のレイヤーに置き、パーティクル撮影用カメラをそのレイヤーだけ描画するようにすれば、パーティクルのみをテクスチャにレンダリングできました。
ちょっと設定をいじれば何とかなるかな?と思ったら、何だかんだで手間がかかってしまいました。
正直ここまでするより質問者さんの解決方法の方がシンプルでいいように思います...
投稿2017/06/16 18:46
総合スコア10818
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。





2017/06/17 01:42