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

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

新規登録して質問してみよう
ただいま回答率
85.35%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

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

Q&A

解決済

1回答

2605閲覧

【Unity】スクショで3Dモデルが二重に表示されてしまう時がある

nakamu

総合スコア82

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

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

0グッド

0クリップ

投稿2020/03/17 05:44

編集2020/03/17 10:21

何度もスクショしてわかったんですが、スクショの写真を確認すると3Dモデルがダブって写ってしまっています。
CommandBufferのレンダリングで間違いがあるのかわからない状況です。

イメージ説明

イメージ説明

イメージ説明

イメージ説明

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using System.IO; 5using UnityEngine.Rendering; 6 7 8public class ScreenShot : MonoBehaviour 9{ 10 11 public event System.Action<RenderTexture> OnCaptured; 12 13 [SerializeField, Tooltip("GUIをレンダリングしているカメラ")] 14 private Camera _guiCamera = null; 15 16 [SerializeField, Tooltip("キャプチャするタイミング")] 17 private CameraEvent _cameraEvent = CameraEvent.BeforeImageEffects; 18 19 [SerializeField, Tooltip("合成時に無視されるUIのレイヤー")] 20 private LayerMask _captureTargetLayer = -1; 21 22 [SerializeField, Tooltip("ARカメラ")] 23 private Camera _mainCamera = null; 24 private RenderTexture _buf = null; 25 private CommandBuffer _commandBuffer = null; 26 27 // ここに前述のY反転シェーダーをセットしておく 28 [SerializeField, Tooltip("Y反転シェーダー")] 29 private Shader _flipYShader; 30 private Material _flipYMaterial; 31 32 33 #region ### MonoBehaviour ### 34 35 private void Awake() 36 { 37 CreateBuffer(); 38 } 39 40 public void OnClick() 41 { 42 // カメラロールに保存する 43 TakeScreenshot(); 44 } 45 46 #endregion ### MonoBehaviour ### 47 48 /// <summary> 49 /// バッファを生成する 50 /// </summary> 51 private void CreateBuffer() 52 { 53 _buf = new RenderTexture(Screen.width, Screen.height, (int)Screen.dpi); 54 _buf.Create(); 55 56 _commandBuffer = new CommandBuffer(); 57 _commandBuffer.name = "CaptureScene"; 58 if (SystemInfo.graphicsDeviceType == GraphicsDeviceType.Metal) 59 { 60 // Metal上で動作している場合、CurrentActiveを一旦別のレンダーテクスチャに写し取り 61 // それをさらにY反転シェーダーを通して_bufにレンダリングする 62 if (_flipYMaterial == null) 63 { 64 _flipYMaterial = new Material(_flipYShader); 65 } 66 int tempTexture = Shader.PropertyToID("_TempTex"); 67 _commandBuffer.GetTemporaryRT(tempTexture, -1, -1); 68 _commandBuffer.Blit(BuiltinRenderTextureType.CurrentActive, tempTexture); 69 _commandBuffer.Blit(tempTexture, _buf, _flipYMaterial); 70 _commandBuffer.ReleaseTemporaryRT(tempTexture); 71 } 72 else 73 { 74 _commandBuffer.Blit(BuiltinRenderTextureType.CurrentActive, _buf); 75 } 76 } 77 78 /// <summary> 79 /// スクリーンショットを撮影する 80 /// </summary> 81 public void TakeScreenshot() 82 { 83 AddCommandBuffer(); 84 85 StartCoroutine(WaitCapture()); 86 } 87 88 /// <summary> 89 /// メインカメラにコマンドバッファを追加する 90 /// </summary> 91 private void AddCommandBuffer() 92 { 93 _mainCamera.AddCommandBuffer(_cameraEvent, _commandBuffer); 94 } 95 96 /// <summary> 97 /// コマンドバッファの処理を待つ 98 /// </summary> 99 private IEnumerator WaitCapture() 100 { 101 yield return new WaitForEndOfFrame(); 102 103 BlendGUI(); 104 105 if (OnCaptured != null) 106 { 107 OnCaptured.Invoke(_buf); 108 } 109 110 RemoveCommandBuffer(); 111 } 112 113 /// <summary> 114 /// GUI要素をブレンドする 115 /// </summary> 116 private void BlendGUI() 117 { 118 _guiCamera.targetTexture = _buf; 119 120 int tmp = _guiCamera.cullingMask; 121 _guiCamera.cullingMask = _captureTargetLayer; 122 123 _guiCamera.Render(); 124 125 _guiCamera.cullingMask = tmp; 126 127 _guiCamera.targetTexture = null; 128 } 129 130 /// <summary> 131 /// メインカメラからコマンドバッファを削除する 132 /// </summary> 133 private void RemoveCommandBuffer() 134 { 135 if (_mainCamera == null) 136 { 137 return; 138 } 139 140 _mainCamera.RemoveCommandBuffer(_cameraEvent, _commandBuffer); 141 } 142 143} 144

C#

1 void Update() 2 { 3 4 if (Input.touchCount > 0 && !flg) 5 { 6 var touch = Input.GetTouch(0); 7 var hitResults = new List<ARRaycastHit>(); 8 if (raycastManager.Raycast(touch.position, hitResults)) 9 { 10 11 unitychan = objectPrefab; 12 unitychan = Instantiate(objectPrefab, hitResults[0].pose.position, Quaternion.identity); 13 14 var size = unitychan.transform.localScale; 15 unitychan.transform.localScale = new Vector3(size.x * 0.7f, size.y * 0.7f, size.z * 0.7f); 16 17 unitychan.AddComponent<LocomotionPlayer>(); 18 LocomotionPlayer locomotionPlayer = unitychan.GetComponent<LocomotionPlayer>(); 19 locomotionPlayer.arCamera = arcamera; 20 21 flg = true; 22 } 23 24 } 25 }

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

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

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

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

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

Bongo

2020/03/17 08:40

「Capture Target Layer」はどのように設定されているでしょうかね?「Mixed...」表示になっているポップアップメニューを開いて中身を表示させたスクリーンショットがあると手がかりになるかもしれません。 それと、そのダブって映っているユニティちゃんのレイヤーはどうなっているでしょうか?
nakamu

2020/03/17 10:23

Bongo様、前回に引き続きご協力頂きありがとうございます。 画像を追加で添付致しました。 また、ユニティちゃんはプレファブからインスタンスして生成しております。 そちらのコードも追加致しました。
Bongo

2020/03/17 10:49

なるほど、ではそのユニティちゃんのプレファブのレイヤー(Projectビュー上でプレファブを選択したとき、インスペクター上の「Layer」に表示されるレイヤー名)はどうなっているでしょうか?
nakamu

2020/03/17 11:00

ストアから落として何もいじってないので、Default状態です
guest

回答1

0

ベストアンサー

プレファブのレイヤーがDefaultということは、シーン上にインスタンス化されたユニティちゃんのレイヤーもDefaultになっているかと思います。
「Capture Target Layer」で指定されている描画対象レイヤーにDefaultが含まれているようですので、_guiCameraから見たユニティちゃんの姿も_buf上に重ね描きされてしまっているような気がしますね。

「Capture Target Layer」の設定は、_buf上に描画させたいレイヤー以外を一通りオフにしてしまった方がいいんじゃないかと思います。「UI」以外のレイヤーを全部オフにすると変化はあるでしょうか?

投稿2020/03/17 11:17

Bongo

総合スコア10811

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

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

nakamu

2020/03/17 11:46

Bongo様のおっしゃる通りでした。 これまで写ったり写らなかったりしてたので念の為数十枚撮ってみましたが「UI」のみにした場合、1枚も写りませんでした! その後、「UI」と「Default」を選択して撮ってみたところ3枚目でまた写ってました。 レイヤーを完全にuGUIのみ関わるものと捉えておりました。 助かりました! 前回に引き続きご協力ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問