Unity每个相机的渲染结果会渲染到Camera.targetTexture上,该参数在面板上默认为空。如果需要获取渲染结果,则需要按照相机渲染设置新建RT并赋值给targetTexture,如
Camera _camera; RenderTexture _rt = RenderTexture.GetTemporary(_camera.pixelWidth, _camera.pixelHeight, 0, RenderTextureFormat.Default); _camera.targetTexture = _rt;
此时相机会正确渲染结果到新建的rt上,但是这张rt没有深度,且即使SRP管线中开启了Depth Texture,在FrameDebugger里查看这个相机的渲染过程中会发现Copy Depth Pass产生的_CameraDepthTexture仍然是Unity Default 2D
因为需要使相机和Frame Buffer同时支持深度,这个DepthBuffer才会存在,否则没有任何深度数据可以被拷贝出来。
打开深度需要执行的设置为
Camera _camera; RenderTexture _rt; //URP设置 UniversalAdditionalCameraData _camData = _cam.TryGetComponent<UniversalAdditionalCameraData>(); _camData.requiresDepthOption = CameraOverrideOption.On; _camData.requiresDepthTexture = true; _camera.depthTextureMode = DepthTextureMode.Depth; //rt设置 _rt.memorylessMode = RenderTextureMemoryless.None;
各个设置的作用:
  • UniversalAdditionalCameraData.requireDepthOption:控制相机是否应该渲染深度,关闭则不渲染深度
  • UniversalAdditionalCameraData.requireDepthTexture:控制相机是否产生深度贴图,如果reqireDepthOption打开但没打开requireDepthTexture则可以渲染深度但不会产生深度图
  • Camera.depthTextureMode:决定产生什么类型的深度图,一般是.Depth,如果需要全屏法线(延迟管线)也可以使用.DepthNormal,也有用于运动模糊的.MotionVector选项
  • RenderTexture.memorylessMode:有None\Color\Depth\MSAA四种,选项表示FrameBuffer中标记为Memoryless(渲染直接丢弃、无法获取)的部分,比如memorylessMode.Color指的是Color为Memoryless,因此结果中不会存有color。如果需要提取depth则需要选择MemorylessMode.Depth之外的种类。如果Color与Depth都需要保存则只能选None或者MSAA。使用方式参考官方描述
 
Camera Clear Color的Gamma设置问题粒子进入Timeline后不能随机的问题