###前提・実現したいこと
ここに質問したいことを詳細
RenderTextureを使ってカメラで撮影したエフェクト(Particle System)をCanvasの配下にあるRawImageに投影させようとしているのですが、どうもカメラの背景(例えば、カメラの設定でSolid Colorで黒を指定している場合は背景の黒と移しているエフェクト)が映りこんでしまいます。こちらをalphaを0にすると今度は何も映らなくなってしまい、どうしたら良いか困っています。
*どうやらParticle Systemを再生させる場合はCanvasが必要そうです。
RenderTextureで無理やりやろうとすると必ずMeshRendererが背後にないと映りません。
結論、無理ということになりました。
もし、それでも可能だという場合があればご教授頂けますと幸いです。
■Unity version
5.5.2 p1
###試したこと
###補足情報(言語/FW/ツール等のバージョンなど)
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
下記のような質問は推奨されていません。
- 質問になっていない投稿
- スパムや攻撃的な表現を用いた投稿
適切な質問に修正を依頼しましょう。
回答1件
1
ベストアンサー
バージョン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にセットしました。
これでプレイモードにすると、透明部分にも描画されるようになったものの、透明部分に描画されたパーティクルに黒いフリンジが発生してしまいました。
###失敗描画の様子その2
これはアルファ乗算済みイメージをストレートアルファイメージのつもりで合成した時に現れる典型的な症状で(こちらのサイトなどがご参考になるでしょうか?)、今度は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
総合スコア10631
下記のような回答は推奨されていません。
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
このような回答には修正を依頼しましょう。
回答へのコメント
関連した質問
Q&A
解決済
arduinoについたセンサーと、pythonで動かすカメラを時間を使って同期を取りたい
回答1
クリップ1
更新
2023/04/01
Q&A
解決済
VIsualStudio2022でDataTableとDataGridViewのバインドをしたいです。
回答1
クリップ1
更新
2023/04/02
Q&A
解決済
「rails」Rspecで表示されたエラー内容について
回答1
クリップ0
更新
2023/04/01
Q&A
解決済
Python whileを一定時間でループする方法
回答1
クリップ0
更新
2023/03/27
Q&A
解決済
nginxでPHPのルーティング
回答1
クリップ0
更新
2023/03/29
意見交換
受付中
WebARのメリットを教えてください。またWebARのメリットを人に教えるいい方法はありますか?
回答3
クリップ0
更新
2023/03/22
Q&A
解決済
unity:CinemachineTransposerが取得できない
回答1
クリップ0
更新
2023/03/25
Q&A
解決済
Rubyのsystemメソッドでsyntax error: invalid arithmetic operator (error token is ".1")
回答1
クリップ0
更新
2023/03/24
同じタグがついた質問を見る
Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。