何度もスクショしてわかったんですが、スクショの写真を確認すると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 }
「Capture Target Layer」はどのように設定されているでしょうかね?「Mixed...」表示になっているポップアップメニューを開いて中身を表示させたスクリーンショットがあると手がかりになるかもしれません。
それと、そのダブって映っているユニティちゃんのレイヤーはどうなっているでしょうか?
Bongo様、前回に引き続きご協力頂きありがとうございます。
画像を追加で添付致しました。
また、ユニティちゃんはプレファブからインスタンスして生成しております。
そちらのコードも追加致しました。
なるほど、ではそのユニティちゃんのプレファブのレイヤー(Projectビュー上でプレファブを選択したとき、インスペクター上の「Layer」に表示されるレイヤー名)はどうなっているでしょうか?
ストアから落として何もいじってないので、Default状態です
回答1件
あなたの回答
tips
プレビュー