Is there a way to get motion vectors and depth with normals from camera by it’s target texture, or in some other way? I cannot use global shader variables _CameraMotionVectorsTexture and _CameraDepthNormalsTexture because I use two cameras. I want to access only data from my second camera and not from the main camera. Thanks in advance.
Ok, I figured it out, I used OnRenderImage method and called inside Graphics.Blit with material that using my shader, inside which I am getting this textures through _CameraMotionVectorsTexture, and _CameraDepthNormalsTexture samplers (in my case _CameraDepthNormalsTexture didn’t worked so I used _LastCameraDepthNormalsTexture). Inside fragment shader I combine them and return to target texture. But motion vector texture gives me weird results and I don’t know exactly how to use it. At least I managed to get to work normals with depth. I post code and shader in case someone needs it.
Code:
public Camera Cam { get { if(_cam == null) { _cam = GetComponent(); } return _cam; } set { _cam = value; } } private Camera _cam; protected void Awake() { Cam.depthTextureMode |= DepthTextureMode.MotionVectors | DepthTextureMode.DepthNormals; } private Material _onRenderMaterial; protected Material OnRenderMaterial { get { if(null == _onRenderMaterial) { _onRenderMaterial = new Material(Shader.Find("Hidden/GrassPhysics/OnRenderCamera")); } return _onRenderMaterial; } } private void OnRenderImage(RenderTexture source, RenderTexture destination) { Matrix4x4 viewToWorld = Cam.cameraToWorldMatrix; OnRenderMaterial.SetMatrix("_viewToWorld", viewToWorld); Graphics.Blit(source, destination, OnRenderMaterial); }
Shader:
Shader "Hidden/GrassPhysics/OnRenderCamera" { Properties { } SubShader { Cull Off ZWrite Off ZTest Always Pass { CGPROGRAM #pragma vertex vertexShader #pragma fragment fragmentShader #include "UnityCG.cginc" struct vertexInput { float4 vertex : POSITION; float2 uv : TEXCOORD0; }; struct vertexOutput { float2 uv : TEXCOORD0; float4 position : SV_POSITION; }; vertexOutput vertexShader(vertexInput i) { vertexOutput o; o.position = UnityObjectToClipPos(i.vertex); o.uv = i.uv; return o; } uniform sampler2D _CameraMotionVectorsTexture; uniform sampler2D _LastCameraDepthNormalsTexture; float4x4 _viewToWorld; float4 fragmentShader(vertexOutput i) : SV_TARGET { float4 col = tex2D(_LastCameraDepthNormalsTexture, i.uv); //decode depthnormal float3 normal; float depth; DecodeDepthNormal(col, depth, normal); #ifdef UNITY_REVERSED_Z depth = 1 - depth; #endif normal = mul((float3x3)_viewToWorld, normal); return float4(depth,normal.rb,1); } ENDCG } } Fallback Off }