using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; #if ZED_HDRP || ZED_URP using UnityEngine.Rendering; #endif /// /// Copies the output of the camera to the selected RawImage, and/or Renderer as a material. /// Use to look at the camera on something other than the final screen output, like a plane or UI element. /// [RequireComponent(typeof(Camera))] public class CopyToSurface : MonoBehaviour { /// /// 2D Raw Image object that you can have the camera output copied to. /// [Tooltip("2D Raw Image object that you can have the camera output copied to.")] public RawImage canvasRawImage; /// /// 3D Renderer that will have its mainTexture set to the camera texture. /// [Tooltip("3D Renderer that will have its mainTexture set to the camera texture.")] public Renderer worldRenderer; /// /// If worldRenderer is set, this is the name of the texture property that will be set with the camera image. /// "_MainTex" works for most Standard render pipeline materials. "_BaseMap" works for most lit URP materials and "_BaseColorMap" for lit HDRP materials. /// [Tooltip("If worldRenderer is set, this is the name of the texture property that will be set with the camera image.\r\n\n" + "'_MainTex' works for most Standard render pipeline materials, '_BaseMap' works for most lit URP materials and '_BaseColorMap' for lit HDRP materials.")] #if !ZED_HDRP && !ZED_URP public string rendererTextureProperty = "_MainTex"; #elif ZED_URP public string rendererTextureProperty = "_BaseMap"; #elif ZED_HDRP public string rendererTextureProperty = "_BaseColorMap"; #endif private Camera cam; private RenderTexture copyTexture; // Use this for initialization void Start() { cam = GetComponent(); #if !ZED_URP copyTexture = new RenderTexture(cam.pixelWidth, cam.pixelHeight, 0); #else copyTexture = new RenderTexture(cam.pixelWidth, cam.pixelHeight, 0, UnityEngine.Experimental.Rendering.GraphicsFormat.B10G11R11_UFloatPack32); #endif copyTexture.Create(); if (canvasRawImage) canvasRawImage.texture = copyTexture; if (worldRenderer) worldRenderer.material.SetTexture(rendererTextureProperty, copyTexture); #if ZED_HDRP || ZED_URP RenderPipelineManager.beginFrameRendering += SRPStartDraw; RenderPipelineManager.endFrameRendering += SRPEndDraw; #endif } #if !ZED_HDRP && !ZED_URP private void OnRenderImage(RenderTexture source, RenderTexture destination) { Graphics.Blit(source, copyTexture); Graphics.Blit(source, destination); } #else private void SRPStartDraw(ScriptableRenderContext context, Camera[] rendcam) { cam.targetTexture = copyTexture; } private void SRPEndDraw(ScriptableRenderContext context, Camera[] rendcam) { cam.targetTexture = null; Graphics.Blit(copyTexture, (RenderTexture)null); } #endif private void OnApplicationQuit() { if (copyTexture) copyTexture.Release(); #if ZED_HDRP || ZED_URP RenderPipelineManager.beginFrameRendering -= SRPStartDraw; RenderPipelineManager.endFrameRendering -= SRPEndDraw; #endif } }