質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

13100閲覧

RenderTextureの実装方法

AppMomiji

総合スコア10

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2017/06/12 03:24

編集2017/06/16 05:37

###前提・実現したいこと
ここに質問したいことを詳細
RenderTextureを使ってカメラで撮影したエフェクト(Particle System)をCanvasの配下にあるRawImageに投影させようとしているのですが、どうもカメラの背景(例えば、カメラの設定でSolid Colorで黒を指定している場合は背景の黒と移しているエフェクト)が映りこんでしまいます。こちらをalphaを0にすると今度は何も映らなくなってしまい、どうしたら良いか困っています。

*どうやらParticle Systemを再生させる場合はCanvasが必要そうです。
RenderTextureで無理やりやろうとすると必ずMeshRendererが背後にないと映りません。
結論、無理ということになりました。

もし、それでも可能だという場合があればご教授頂けますと幸いです。

■Unity version
5.5.2 p1

###試したこと

###補足情報(言語/FW/ツール等のバージョンなど)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Bongo

2017/06/16 00:49

余裕があれば試してみようかと思うのですが、条件の確認として、・パーティクルを飛ばす様子をパーティクル撮影用カメラで撮影する。・撮影された映像はRenderTextureにレンダリングされるようにする。・描画されたRenderTextureをRawImageに表示する。この時、映されたパーティクルの背景は透明で、RawImageの後ろにあるものも見えるようにしたい。...ということでいいでしょうか?
AppMomiji

2017/06/16 05:34

お世話になります。Bongoさんのご質問の通りでございます。
guest

回答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にセットしました。
これでプレイモードにすると、透明部分にも描画されるようになったものの、透明部分に描画されたパーティクルに黒いフリンジが発生してしまいました。

###失敗描画の様子その2
失敗描画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

Bongo

総合スコア10807

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

AppMomiji

2017/06/17 01:42

Bongoさん ご回答くださりありがとうございます。大変感謝しております。 内容ですが流石です。私もシェーダー周りでParticleを写すカメラにマテリアルをくっつける等のことを試したのですが、シェーダー周りの知識があまりなく断念しておりました。 Unityエンジニアとして活動するにはシェーダーの知識は必須ですね。 ご教授いただいた方法を試してみます。僕は諦めて3Dモデルを写す用途だけにするという短絡的な方法で解決してしまっておりました。お恥ずかしいです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問