private void RenderToTextures(Camera CustomCamera, CameraData Data, LayerMask CullingMask, bool RenderMaskSeperate) { CustomCamera.clearFlags = CameraClearFlags.SolidColor; CustomCamera.backgroundColor = Color.clear; switch (Data.replacement) { case ShaderReplacement.Mobile: //Set culling layers CustomCamera.cullingMask = CullingMask; //Render to mask buffer CustomCamera.targetTexture = Data.MaskBuffers[0]; DrawMaskPasses(CustomCamera, Data, MaskShader, CullingMask); //Tell shaders not to use custom or precision depth/normals Shader.DisableKeyword("_PrecisionDepthNormals"); Shader.DisableKeyword("_CustomDepthNormals"); break; case ShaderReplacement.VR: //Set culling layers CustomCamera.cullingMask = CullingMask; //Render to a normal buffer CustomCamera.targetTexture = Data.Normals; DrawRegualarPass(CustomCamera, NormalShader); //Render to mask buffer CustomCamera.targetTexture = Data.MaskBuffers[0]; DrawMaskPasses(CustomCamera, Data, MaskShader, CullingMask); //Tell shaders to use precision depth/normals Shader.EnableKeyword("_PrecisionDepthNormals"); Shader.DisableKeyword("_CustomDepthNormals"); break; case ShaderReplacement.Standard: if (RenderMaskSeperate) { //Render to depth and normal buffers at once RenderBuffer[] buffers = new RenderBuffer[] { Data.Depth.colorBuffer, Data.Normals.colorBuffer }; CustomCamera.SetTargetBuffers(buffers, Data.Depth.depthBuffer); DrawRegualarPass(CustomCamera, DepthNormalShader); //Render to mask buffer CustomCamera.targetTexture = Data.MaskBuffers[0]; DrawMaskPasses(CustomCamera, Data, MaskShader, CullingMask); } else { //Render to depth, normal and mask buffers at once RenderBuffer[] buffers = new RenderBuffer[] { Data.Depth.colorBuffer, Data.Normals.colorBuffer, Data.MaskBuffers[0].colorBuffer }; CustomCamera.SetTargetBuffers(buffers, Data.Depth.depthBuffer); DrawMaskPasses(CustomCamera, Data, DepthNormalMaskShader, CullingMask); } //Tell shaders to use custom depth/normals Shader.DisableKeyword("_PrecisionDepthNormals"); Shader.EnableKeyword("_CustomDepthNormals"); break; } }
private void PreShaderReplacement(Camera Camera, CameraData Data) { if (Projections.Count > 0 && shaderReplacement) { //Grab a reference to custom camera Camera customCamera = CustomCamera; //Set up camera customCamera.CopyFrom(Camera); customCamera.renderingPath = RenderingPath.Forward; customCamera.depthTextureMode = DepthTextureMode.None; customCamera.useOcclusionCulling = false; customCamera.allowMSAA = false; customCamera.allowHDR = false; customCamera.rect = FullRect; //Get render texture/s GetTextures(Camera, customCamera, Data.replacement); //Render into textures if (UnityEngine.XR.XRSettings.enabled && Camera.stereoTargetEye != StereoTargetEyeMask.None && Settings.SinglePassVR) { //Create render textures for eyes RenderTexture eyeDepth = (Camera.actualRenderingPath == RenderingPath.DeferredShading)? RenderTexture.GetTemporary(UnityEngine.XR.XRSettings.eyeTextureWidth, UnityEngine.XR.XRSettings.eyeTextureHeight, 24, depthFormat) : null; RenderTexture eyeNormals = RenderTexture.GetTemporary(UnityEngine.XR.XRSettings.eyeTextureWidth, UnityEngine.XR.XRSettings.eyeTextureHeight, 24, normalFormat); RenderTexture eyeMask = RenderTexture.GetTemporary(UnityEngine.XR.XRSettings.eyeTextureWidth, UnityEngine.XR.XRSettings.eyeTextureHeight, 24, maskFormat); //Left eye if (Camera.stereoTargetEye == StereoTargetEyeMask.Both || Camera.stereoTargetEye == StereoTargetEyeMask.Left) { //Position & rotation customCamera.transform.position = Camera.transform.parent.TransformPoint(UnityEngine.XR.InputTracking.GetLocalPosition(UnityEngine.XR.XRNode.LeftEye)); customCamera.transform.rotation = Camera.transform.rotation * UnityEngine.XR.InputTracking.GetLocalRotation(UnityEngine.XR.XRNode.LeftEye); //Projection matrix customCamera.projectionMatrix = Camera.GetStereoProjectionMatrix(Camera.StereoscopicEye.Left); //View matrix Matrix4x4 worldToCamera = Camera.worldToCameraMatrix; customCamera.worldToCameraMatrix = worldToCamera; //Render RenderToTextures(Camera, customCamera, Data.replacement, eyeDepth, eyeNormals, eyeMask, Camera.cullingMask); //Blit into buffer if (Camera.actualRenderingPath == RenderingPath.DeferredShading) { StereoDepthBlitLeft.SetTexture("_DepthTex", eyeDepth); Graphics.Blit(eyeDepth, depthBuffer, StereoDepthBlitLeft); } Graphics.Blit(eyeNormals, normalBuffer, StereoBlitLeft); Graphics.Blit(eyeMask, maskBuffer, StereoBlitLeft); } //Right eye if (Camera.stereoTargetEye == StereoTargetEyeMask.Both || Camera.stereoTargetEye == StereoTargetEyeMask.Right) { //Position & rotation customCamera.transform.position = Camera.transform.parent.TransformPoint(UnityEngine.XR.InputTracking.GetLocalPosition(UnityEngine.XR.XRNode.RightEye)); customCamera.transform.rotation = Camera.transform.rotation * UnityEngine.XR.InputTracking.GetLocalRotation(UnityEngine.XR.XRNode.RightEye); //Projection matrix customCamera.projectionMatrix = Camera.GetStereoProjectionMatrix(Camera.StereoscopicEye.Right); //View matrix Matrix4x4 worldToCamera = Camera.worldToCameraMatrix; worldToCamera.m03 -= Camera.stereoSeparation; customCamera.worldToCameraMatrix = worldToCamera; //Render RenderToTextures(Camera, customCamera, Data.replacement, eyeDepth, eyeNormals, eyeMask, Camera.cullingMask); //Blit into buffer if (Camera.actualRenderingPath == RenderingPath.DeferredShading) { StereoDepthBlitRight.SetTexture("_DepthTex", eyeDepth); Graphics.Blit(eyeDepth, depthBuffer, StereoDepthBlitRight); } Graphics.Blit(eyeNormals, normalBuffer, StereoBlitRight); Graphics.Blit(eyeMask, maskBuffer, StereoBlitRight); } //Release eye render textures if (Camera.actualRenderingPath == RenderingPath.DeferredShading) { eyeDepth.Release(); } eyeNormals.Release(); eyeMask.Release(); } else { RenderToTextures(Camera, customCamera, Data.replacement, depthBuffer, normalBuffer, maskBuffer, Camera.cullingMask); } //Set completed render texture/s as global shader buffers SetAsBuffers(Camera, Data.replacement); } }
private void PreShaderReplacement(Camera Camera, CameraData Data) { if (Projections.Count > 0 && shaderReplacement) { //Grab a reference to custom camera Camera customCamera = Data.CustomCamera; //Set up camera customCamera.CopyFrom(Camera); customCamera.renderingPath = RenderingPath.Forward; customCamera.depthTextureMode = DepthTextureMode.None; //Should we render the mask layers in a seperate pass bool renderMaskSeperate = (Data.replacement != ShaderReplacement.Standard || SystemInfo.supportedRenderTargetCount < 3); //Get render texture/s GetTextures(Camera, customCamera, Data, renderMaskSeperate); //Render into textures if (VRSettings.enabled && Settings.SinglePassVR && Camera.stereoEnabled) { //Left eye if (Camera.stereoTargetEye == StereoTargetEyeMask.Both || Camera.stereoTargetEye == StereoTargetEyeMask.Left) { //Rect customCamera.rect = new Rect(0, 0, 0.5f, 1); //Position & rotation customCamera.transform.position = Camera.transform.parent.TransformPoint(InputTracking.GetLocalPosition(VRNode.LeftEye)); customCamera.transform.rotation = Camera.transform.rotation * InputTracking.GetLocalRotation(VRNode.LeftEye); //Projection matrix customCamera.projectionMatrix = Camera.GetStereoProjectionMatrix(Camera.StereoscopicEye.Left); //View matrix Matrix4x4 worldToCamera = Camera.worldToCameraMatrix; customCamera.worldToCameraMatrix = worldToCamera; //Render RenderToTextures(customCamera, Data, Camera.cullingMask, renderMaskSeperate); } //Right eye if (Camera.stereoTargetEye == StereoTargetEyeMask.Both || Camera.stereoTargetEye == StereoTargetEyeMask.Right) { //Rect customCamera.rect = new Rect(0.5f, 0, 0.5f, 1); //Position & rotation customCamera.transform.position = Camera.transform.parent.TransformPoint(InputTracking.GetLocalPosition(VRNode.RightEye)); customCamera.transform.rotation = Camera.transform.rotation * InputTracking.GetLocalRotation(VRNode.RightEye); //Projection matrix customCamera.projectionMatrix = Camera.GetStereoProjectionMatrix(Camera.StereoscopicEye.Right); //View matrix Matrix4x4 worldToCamera = Camera.worldToCameraMatrix; worldToCamera.m03 -= Camera.stereoSeparation; customCamera.worldToCameraMatrix = worldToCamera; //Render RenderToTextures(customCamera, Data, Camera.cullingMask, renderMaskSeperate); } } else { customCamera.rect = FullRect; RenderToTextures(customCamera, Data, Camera.cullingMask, renderMaskSeperate); } //Set completed render texture/s as global shader buffers SetAsBuffers(Data); //Tell camera to stop rendering to render texture/s customCamera.targetTexture = null; } }