Exemple #1
0
        internal bool RefreshXrSdk()
        {
            GetDisplaySubsystem();

            if (displayList.Count > 0)
            {
                if (displayList.Count > 1)
                {
                    throw new NotImplementedException("Only 1 XR display is supported.");
                }

                display = displayList[0];
                display.disableLegacyRenderer = true;

                // Refresh max views
                TextureXR.maxViews = Math.Max(TextureXR.slices, GetMaxViews());

                return(display.running);
            }
            else
            {
                display = null;
            }

            return(false);
        }
Exemple #2
0
 private void OnDisable()
 {
     RenderPipelineManager.endCameraRendering   -= OnEndCamera;
     RenderPipelineManager.beginCameraRendering -= OnBeginCamera;
     myCam   = null;
     display = null;
 }
        public bool SetupForSingleCamera(float left, float right, float top, float bottom)
        {
            List <XRDisplaySubsystem> xrDisplayList = new List <XRDisplaySubsystem>();

            SubsystemManager.GetInstances(xrDisplayList);
            if (xrDisplayList.Count != 1)
            {
                return(false);
            }
            XRDisplaySubsystem display = xrDisplayList[0];

            if (display.GetRenderPassCount() != 1)
            {
                return(false);
            }

            display.GetRenderPass(0, out var renderPass);
            if (renderPass.GetRenderParameterCount() != 1)
            {
                return(false);
            }

            SetProjectionParamsForSingleCamera(left, right, top, bottom);
            Debug.Log($"{PluginMetadata.DebugLogPrefix}Sent single-cam projection parameters to native plugin.");
            return(true);
        }
    // Update is called once per frame
    void Update()
    {
        if (AllowMovement)
        {
            float gamePad_FwdAxis    = OVRInput.Get(OVRInput.RawAxis2D.LThumbstick).y;
            float gamePad_StrafeAxis = OVRInput.Get(OVRInput.RawAxis2D.LThumbstick).x;

            Vector3 fwdMove    = (CameraRig.centerEyeAnchor.rotation * Vector3.forward) * gamePad_FwdAxis * Time.deltaTime * ForwardSpeed;
            Vector3 strafeMove = (CameraRig.centerEyeAnchor.rotation * Vector3.right) * gamePad_StrafeAxis * Time.deltaTime * StrafeSpeed;
            transform.position += fwdMove + strafeMove;
        }

        bool hasDevice = false;

#if USING_XR_SDK
        XRDisplaySubsystem currentDisplaySubsystem = OVRManager.GetCurrentDisplaySubsystem();
        if (currentDisplaySubsystem != null)
        {
            hasDevice = currentDisplaySubsystem.running;
        }
#elif REQUIRES_XR_SDK
        hasDevice = false;
#else
        hasDevice = UnityEngine.XR.XRDevice.isPresent;
#endif

        if (!hasDevice && (AllowYawLook || AllowPitchLook))
        {
            Quaternion r = transform.rotation;
            if (AllowYawLook)
            {
                float      gamePadYaw = OVRInput.Get(OVRInput.RawAxis2D.RThumbstick).x;
                float      yawAmount  = gamePadYaw * Time.deltaTime * GamePad_YawDegreesPerSec;
                Quaternion yawRot     = Quaternion.AngleAxis(yawAmount, Vector3.up);
                r = yawRot * r;
            }
            if (AllowPitchLook)
            {
                float gamePadPitch = OVRInput.Get(OVRInput.RawAxis2D.RThumbstick).y;
                if (Mathf.Abs(gamePadPitch) > 0.0001f)
                {
                    if (InvertPitch)
                    {
                        gamePadPitch *= -1.0f;
                    }
                    float      pitchAmount = gamePadPitch * Time.deltaTime * GamePad_PitchDegreesPerSec;
                    Quaternion pitchRot    = Quaternion.AngleAxis(pitchAmount, Vector3.left);
                    r = r * pitchRot;
                }
            }

            transform.rotation = r;
        }
    }
Exemple #5
0
        XRDisplaySubsystem GetXRDisplaySubsystem()
        {
            XRDisplaySubsystem ret = null;

            SubsystemManager.GetInstances <XRDisplaySubsystem>(s_displaySubsystems);
            if (s_displaySubsystems.Count > 0)
            {
                ret = s_displaySubsystems[0];
            }
            return(ret);
        }
        /// <summary>
        /// Sets the game view settings at runtime.
        /// </summary>
        /// <param name="newOption">enable or disable</param>
        public void SetGameView(GameViewOptions newOption)
        {
            RenderGameView = newOption;
            List <XRDisplaySubsystem> xrDisplayList = new List <XRDisplaySubsystem>();

            SubsystemManager.GetInstances(xrDisplayList);
            if (xrDisplayList.Count == 1)
            {
                XRDisplaySubsystem display = xrDisplayList[0];
                // This line turns off rendering to the default game view.
                display.disableLegacyRenderer = (newOption == GameViewOptions.Disable);
            }
        }
Exemple #7
0
    public static bool IsHmdPresent()
    {
        if (OVRManager.OVRManagerinitialized && OVRManager.loadedXRDevice == OVRManager.XRDevice.Oculus)
        {
            return(OVRPlugin.hmdPresent);
        }
#if USING_XR_SDK
        XRDisplaySubsystem currentDisplaySubsystem = OVRManager.GetCurrentDisplaySubsystem();
        if (currentDisplaySubsystem != null)
        {
            return(currentDisplaySubsystem.running);                                    //In 2019.3, this should be changed to currentDisplaySubsystem.isConnected, but this is a fine placeholder for now.
        }
        return(false);
#else
        return(Device.isPresent);
#endif
    }
Exemple #8
0
        void DisplayRenderTextures(XRDisplaySubsystem displaySubsystem)
        {
            RenderTexture rt = displaySubsystem.GetRenderTextureForRenderPass(s_renderPass.renderPassIndex);

            if (rt == null)
            {
                return;
            }

            int           rpc    = s_renderPass.GetRenderParameterCount();
            RenderTexture target = new RenderTexture(rt.width, rt.height, rt.depth);

            Graphics.CopyTexture(rt, 0, target, 0);
            EditorGUILayout.BeginHorizontal();

            Rect r = EditorGUILayout.GetControlRect(false, textureImageHeight,
                                                    GUILayout.MaxWidth(textureImageWidth + textureImageLeftPadding),
                                                    GUILayout.Width(textureImageWidth),
                                                    GUILayout.MaxHeight(textureImageHeight + textureImageSpace));

            EditorGUI.DrawPreviewTexture(r, target);

            if (rpc > 1)
            {
                Graphics.CopyTexture(rt, 1, target, 0);

                r = EditorGUILayout.GetControlRect(false, textureImageHeight,
                                                   GUILayout.MaxWidth(textureImageWidth + textureImageLeftPadding),
                                                   GUILayout.Width(textureImageWidth),
                                                   GUILayout.MaxHeight(textureImageHeight + textureImageSpace));


                EditorGUI.DrawPreviewTexture(r, target);
            }
            target.DiscardContents();
            target.Release();

            EditorGUILayout.EndHorizontal();
        }
Exemple #9
0
    private void PopulateDisplaySubsystem()
    {
        List <XRDisplaySubsystem> xrDisplayList = new List <XRDisplaySubsystem>();

        SubsystemManager.GetInstances(xrDisplayList);
        if (xrDisplayList.Count == 1)
        {
            if (display == null)
            {
                Debug.Log("Got single active XRDisplaySubsystem");
            }
            display = xrDisplayList[0];
        }
        else
        {
            if (display != null)
            {
                Debug.Log("Clearing cached XRDisplaySubsystem");
            }
            display = null;
        }
    }
Exemple #10
0
    IEnumerator SwitchToVR()
    {
        SubsystemManager.GetSubsystemDescriptors(displays);
        Debug.Log("Number of display providers found: " + displays.Count);
        foreach (var d in displays)
        {
            Debug.Log("Scanning display id: " + d.id);

            if (d.id.Contains("OpenXR Display"))
            {
                Debug.Log("Creating display " + d.id);
                dispInst = d.Create();
                if (dispInst != null)
                {
                    Debug.Log("Starting display ");
                    dispInst.Start();
                }
            }
        }

        // Wait one frame!
        yield return(null);
    }
    protected override void Render(ScriptableRenderContext context, Camera[] cameras)
    {
        m_asset.memoryConsumption = 0f;
        instance = this;

        display = displayList.Count > 0 && displayList[0].running ? displayList[0] : null;
        bool xrEnabled = XRSettings.isDeviceActive;

        // Sort cameras array by camera depth
        Array.Sort(cameras, m_CameraComparer);

        // SetupShaderGlobals
        // =====================================================================================================
        LogTrace("SetupShaderGlobals...");
        {
            CommandBuffer cmd5 = CommandBufferPool.Get("SetupShaderGlobals");
            cmd5.SetGlobalFloat("g_AtlasResolutionScale",
                                m_asset.atlasResolutionScale / m_asset.visibilityPassDownscale);
            float lerpFactor =
                Mathf.Clamp01((float)timeSinceLastRender /
                              (1f / m_asset.atlasRefreshFps));                 //TODO: clamp should't been neccesary

            cmd5.SetGlobalFloat("g_atlasMorph", lerpFactor);
            cmd5.SetGlobalTexture("g_Dither", m_asset.dither[0]);
            if (m_asset.TexelSpaceBackfaceCulling)
            {
                cmd5.EnableShaderKeyword("TRIANGLE_CULLING");
            }
            else
            {
                cmd5.DisableShaderKeyword("TRIANGLE_CULLING");
            }

            context.ExecuteCommandBuffer(cmd5);
            CommandBufferPool.Release(cmd5);
        }
        bool shouldUpdateAtlas = timeSinceLastRender > 1f / m_asset.atlasRefreshFps;

        foreach (Camera camera in cameras)
        {
            //XR

            SCREEN_X = camera.pixelWidth;
            SCREEN_Y = camera.pixelHeight;

            SortingSettings             cameraSortSettings = new SortingSettings(camera);
            ScriptableCullingParameters cullingParameters;

            if (!camera.TryGetCullingParameters(xrEnabled, out cullingParameters))
            {
                continue;
            }

            m_CullResults = context.Cull(ref cullingParameters);

            context.SetupCameraProperties(camera, xrEnabled);

            #region XRtest

            {
                var cmd = CommandBufferPool.Get("Test");

                if (display != null)                 //Vr is enabled
                {
                    #region setup stero rendering
                    // XRTODO: Handle stereo mode selection in URP pipeline asset UI
                    display.textureLayout = XRDisplaySubsystem.TextureLayout.Texture2DArray;
                    display.zNear         = camera.nearClipPlane;
                    display.zFar          = camera.farClipPlane;
                    display.sRGB          = QualitySettings.activeColorSpace == ColorSpace.Linear;

                    display.GetRenderPass(0, out XRDisplaySubsystem.XRRenderPass xrRenderPass);
                    cmd.SetRenderTarget(xrRenderPass.renderTarget);
                    xrRenderPass.GetRenderParameter(camera, 0, out var renderParameter0);
                    xrRenderPass.GetRenderParameter(camera, 1, out var renderParameter1);
                    #endregion
                    #region enable stero rendering
                    //enable single pass (see XRPass.cs:344)
                    if (SystemInfo.supportsMultiview)
                    {
                        cmd.EnableShaderKeyword("STEREO_MULTIVIEW_ON");
                        cmd.SetGlobalVectorArray("unity_StereoEyeIndices", stereoEyeIndices);
                    }
                    else
                    {
                        cmd.EnableShaderKeyword("STEREO_INSTANCING_ON");
                        const int viewCount = 2;
                        cmd.SetInstanceMultiplier((uint)viewCount);
                    }
                    cmd.EnableShaderKeyword(ShaderKeywordStrings.UseDrawProcedural);
                    #endregion
                }
                else
                {
                    cmd.SetRenderTarget(BuiltinRenderTextureType.CameraTarget);
                }

                cmd.ClearRenderTarget(true, true, Color.green);
                context.ExecuteCommandBuffer(cmd);
                //RenderOpaque(context, m_VistaPass, cameraSortSettings);
                context.DrawSkybox(camera);

                #region Disable stero rendering
                if (SystemInfo.supportsMultiview)
                {
                    cmd.DisableShaderKeyword("STEREO_MULTIVIEW_ON");
                }
                else
                {
                    cmd.DisableShaderKeyword("STEREO_INSTANCING_ON");
                    cmd.SetInstanceMultiplier(1);
                }
                cmd.DisableShaderKeyword(ShaderKeywordStrings.UseDrawProcedural);
                #endregion
            }
            #endregion
            int targetAtlasSize = m_asset.maximalAtlasSizePixel;
            if (g_VistaAtlas_A == null || g_VistaAtlas_A.width != targetAtlasSize)
            {
                CommandBuffer cmd5 = CommandBufferPool.Get("(Re)initialize Atlas");
                if (g_VistaAtlas_A != null)
                {
                    g_VistaAtlas_A.Release();
                    g_VistaAtlas_B.Release();
                }

                g_VistaAtlas_A = new RenderTexture(
                    targetAtlasSize,
                    targetAtlasSize,
                    0,
                    RenderTextureFormat.ARGB2101010,
                    RenderTextureReadWrite.sRGB);

                g_VistaAtlas_A.Create();
                g_VistaAtlas_B = new RenderTexture(g_VistaAtlas_A);
                g_VistaAtlas_B.Create();

                cmd5.SetRenderTarget(g_VistaAtlas_A);
                cmd5.ClearRenderTarget(true, true, Color.black);

                cmd5.SetRenderTarget(g_VistaAtlas_B);
                cmd5.ClearRenderTarget(true, true, Color.black);

                context.ExecuteCommandBuffer(cmd5);
                CommandBufferPool.Release(cmd5);
            }

            // TODO: reuse uv output to skip rendering objects a third time in VistaPass

            CommandBuffer createCameraRT = CommandBufferPool.Get("Create Camera RT");
            createCameraRT.GetTemporaryRT(
                g_CameraTarget,
                SCREEN_X,
                SCREEN_Y,
                24,
                FilterMode.Bilinear,
                RenderTextureFormat.ARGB32,
                RenderTextureReadWrite.sRGB,
                Mathf.NextPowerOfTwo(m_asset.MSSALevel));

            createCameraRT.SetRenderTarget(g_CameraTarget);
            createCameraRT.ClearRenderTarget(true, true, Color.clear);
            context.ExecuteCommandBuffer(createCameraRT);

            if (shouldUpdateAtlas)
            {
                //Debug.Log(DateTime.Now.ToString("hh.mm.ss.ffffff") + "render" + timeSinceLastRender.ToString());
                target_atlasA = !target_atlasA;
                // =====================================================================================================
                // CopyDataToPreFrameBuffer
                // =====================================================================================================
                // LogVerbose("CopyDataToPreFrameBuffer...");
                CommandBuffer cmd = CommandBufferPool.Get("CopyDataToPreFrameBuffer");

                cmd.SetComputeBufferParam(m_ResolveCS, m_cs_CopyDataToPreFrameBuffer, "g_ObjectToAtlasProperties",
                                          g_ObjectToAtlasProperties);
                cmd.SetComputeBufferParam(m_ResolveCS, m_cs_CopyDataToPreFrameBuffer, "g_prev_ObjectToAtlasProperties",
                                          g_prev_ObjectToAtlasProperties);
                uint threadsX, threadsY, threadsZ;
                m_ResolveCS.GetKernelThreadGroupSizes(m_cs_CopyDataToPreFrameBuffer, out threadsX, out threadsY,
                                                      out threadsZ);
                cmd.DispatchCompute(m_ResolveCS, m_cs_CopyDataToPreFrameBuffer,
                                    Mathf.CeilToInt(MAXIMAL_OBJECTS_PER_VIEW / (float)64.0), 1, 1);

                cmd.SetComputeBufferParam(m_ResolveCS, m_cs_InitalizePrimitiveVisiblity, g_PrimitiveVisibilityID,
                                          g_PrimitiveVisibility);
                cmd.DispatchCompute(m_ResolveCS, m_cs_InitalizePrimitiveVisiblity,
                                    Mathf.CeilToInt(g_PrimitiveVisibility.count / (float)threadsX), 1, 1);
                context.ExecuteCommandBuffer(cmd);
                CommandBufferPool.Release(cmd);
                // =====================================================================================================
                // SetupRenderBuffers
                // =====================================================================================================
                LogTrace("SetupRenderBuffers...");
                CommandBuffer cmd1    = CommandBufferPool.Get("SetupBuffers");
                int           screenX = camera.pixelWidth;
                int           screenY = camera.pixelHeight;
                g_visibilityBuffer_dimension = new Vector2Int(
                    Mathf.CeilToInt(screenX / m_asset.visibilityPassDownscale),
                    Mathf.CeilToInt(screenY / m_asset.visibilityPassDownscale));

                cmd1.GetTemporaryRT(g_VisibilityBufferID, g_visibilityBuffer_dimension.x,
                                    g_visibilityBuffer_dimension.y, 32, FilterMode.Point, RenderTextureFormat.RInt,
                                    RenderTextureReadWrite.Linear, 1);

                cmd1.SetRenderTarget(g_visibilityBuffer_RT);
                cmd1.ClearRenderTarget(true, true, Color.clear);

                cmd1.SetRenderTarget(target_atlasA ? g_VistaAtlas_A : g_VistaAtlas_B);
                if (m_asset.clearAtlasOnRefresh)
                {
                    cmd1.ClearRenderTarget(true, true, Color.clear);
                }

                cmd1.SetGlobalTexture("g_VistaAtlas", target_atlasA ? g_VistaAtlas_A : g_VistaAtlas_B);
                cmd1.SetGlobalTexture("g_prev_VistaAtlas", target_atlasA ? g_VistaAtlas_B : g_VistaAtlas_A);
                cmd1.SetGlobalFloat("g_AtlasSizeExponent", m_asset.maximalAtlasSizeExponent);
                context.ExecuteCommandBuffer(cmd1);
                CommandBufferPool.Release(cmd1);
                // =====================================================================================================
                // Visiblity Pass
                // Figure out what objects (and triangles) are visible and needed to be rendered.
                // =====================================================================================================
                // renders the current view as: objectID, primitveID and mipmap level
                g_Object_MipmapLevelA.SetCounterValue(0);
                CommandBuffer cmd2 = CommandBufferPool.Get("RenderTexelCoverage");
                cmd2.SetRenderTarget(g_VisibilityBufferID);
                //cmd.SetGlobalBuffer("g_ObjectToAtlasPropertiesRW", g_ObjectToAtlasProperties);
                //cmd.SetRandomWriteTarget(1, g_ObjectToAtlasProperties);

                //g_vertexIDVisiblity_B.SetData(g_vertexIDVisiblity_B_init);
                context.ExecuteCommandBuffer(cmd2);

                cameraSortSettings.criteria = SortingCriteria.OptimizeStateChanges;
                context.StartMultiEye(camera);
                RenderOpaque(context, m_VisibilityPass, cameraSortSettings);
                context.StopMultiEye(camera);

                cmd2.Clear();
                cmd2.ClearRandomWriteTargets();

                // VISIBLITY DISSOLVE PASS
                // maps the previous rendered data into usable buffers
                cmd2.SetComputeTextureParam(m_ResolveCS, m_cs_ExtractVisibility, g_VisibilityBufferID,
                                            g_visibilityBuffer_RT);
                cmd2.SetComputeBufferParam(m_ResolveCS, m_cs_ExtractVisibility, g_PrimitiveVisibilityID,
                                           g_PrimitiveVisibility);
                cmd2.SetComputeBufferParam(m_ResolveCS, m_cs_ExtractVisibility, "g_ObjectToAtlasProperties",
                                           g_ObjectToAtlasProperties);

                cmd2.SetComputeBufferParam(m_ResolveCS, m_cs_ExtractVisibility, "g_ObjectMipMap_append",
                                           g_Object_MipmapLevelA);
                cmd2.DispatchCompute(m_ResolveCS, m_cs_ExtractVisibility, SCREEN_X / COMPUTE_COVERAGE_TILE_SIZE,
                                     SCREEN_Y / COMPUTE_COVERAGE_TILE_SIZE, 1);
                cmd2.CopyCounterValue(g_Object_MipmapLevelA, g_ObjectMipMapCounterValue, 0);
                cmd2.SetComputeBufferParam(m_ResolveCS, m_cs_MipMapFinalize, "g_ObjectMipMap_consume",
                                           g_Object_MipmapLevelA);
                cmd2.SetComputeBufferParam(m_ResolveCS, m_cs_MipMapFinalize, "g_ObjectToAtlasProperties",
                                           g_ObjectToAtlasProperties);
                cmd2.SetComputeBufferParam(m_ResolveCS, m_cs_MipMapFinalize, "g_ObjectMipMapCounterValue",
                                           g_ObjectMipMapCounterValue);
                cmd2.DispatchCompute(m_ResolveCS, m_cs_MipMapFinalize, 1, 1, 1);

                context.ExecuteCommandBuffer(cmd2);

                cmd2.Clear();

                // optional debug pass
                switch (m_asset.debugPass)
                {
                case TexelSpaceDebugMode.VisibilityPassObjectID:
                case TexelSpaceDebugMode.VisibilityPassPrimitivID:
                case TexelSpaceDebugMode.VisibilityPassMipMapPerObject:
                case TexelSpaceDebugMode.VisibilityPassMipMapPerPixel:
                    int debugView = Shader.PropertyToID("g_DebugTexture");
                    cmd2.GetTemporaryRT(debugView, SCREEN_X, SCREEN_Y, 16, FilterMode.Point,
                                        RenderTextureFormat.ARGB32, RenderTextureReadWrite.Linear, 1, true);
                    cmd2.SetComputeTextureParam(m_ResolveCS, m_cs_DebugVisibilityBuffer, g_VisibilityBufferID,
                                                g_visibilityBuffer_RT);
                    cmd2.SetComputeTextureParam(m_ResolveCS, m_cs_DebugVisibilityBuffer, "g_DebugTexture",
                                                debugView);
                    cmd2.SetComputeBufferParam(m_ResolveCS, m_cs_DebugVisibilityBuffer,
                                               "g_ObjectToAtlasPropertiesR", g_ObjectToAtlasProperties);
                    cmd2.SetComputeIntParam(m_ResolveCS, "g_DebugPassID", (int)m_asset.debugPass);
                    cmd2.DispatchCompute(
                        m_ResolveCS,
                        m_cs_DebugVisibilityBuffer,
                        SCREEN_X / 8,
                        SCREEN_Y / 8,
                        1);

                    cmd2.Blit(debugView, g_CameraTarget);
                    cmd2.ReleaseTemporaryRT(debugView);

                    context.ExecuteCommandBuffer(cmd2);
                    cmd2.Clear();

                    break;
                }

                CommandBufferPool.Release(cmd2);
                // =====================================================================================================
                // PackAtlas
                // =====================================================================================================
                LogTrace("PackAtlas...");
                CommandBuffer cmd3 = CommandBufferPool.Get("PackAtlas");
                atlasAxisSize = m_asset.maximalAtlasSizePixel;

                for (int i = 0; i < visibleObjects.Count; i++)
                {
                    visibleObjects[i].SetAtlasProperties(i + 1, 1);                     //objectID 0 is reserved for "undefined"
                }

                cmd3.SetComputeIntParam(m_ResolveCS, "g_totalObjectsInView", visibleObjects.Count + 1);
                cmd3.SetComputeIntParam(m_ResolveCS, "g_atlasAxisSize", atlasAxisSize);

                cmd3.SetComputeBufferParam(m_ResolveCS, m_cs_AtlasPacking, "g_ObjectToAtlasProperties",
                                           g_ObjectToAtlasProperties);

                cmd3.DispatchCompute(m_ResolveCS, m_cs_AtlasPacking, 1, 1, 1);

                visibleObjects.Clear();
                context.ExecuteCommandBuffer(cmd3);
                CommandBufferPool.Release(cmd3);
                // =====================================================================================================
                // RenderTexelShading
                // =====================================================================================================
                CommandBuffer cmd4 = CommandBufferPool.Get("RenderTexelShading");
                LogTrace("setup light array...");
                NativeArray <VisibleLight> visibleLights = m_CullResults.visibleLights;
                g_LightsOriginRange.Clear();
                g_LightColorAngle.Clear();
                for (int i1 = 0; i1 < MAX_LIGHTS; i1++)
                {
                    if (i1 >= visibleLights.Length)
                    {
                        // fill up buffer with zero lights
                        g_LightsOriginRange.Add(Vector4.zero);
                        g_LightColorAngle.Add(Vector4.zero);
                        continue;
                    }

                    VisibleLight light = visibleLights[i1];

                    // if it's a directional light, just treat it as a point light and place it very far away
                    Vector4 lightOriginRange = light.lightType == LightType.Directional
                                                ? -light.light.transform.forward * 99999f
                                                : light.light.transform.position;
                    lightOriginRange.w = light.lightType == LightType.Directional ? 99999999f : light.range;
                    g_LightsOriginRange.Add(lightOriginRange);

                    Vector4 lightColorAngle;
                    lightColorAngle   = light.light.color * light.light.intensity;
                    lightColorAngle.w = light.lightType == LightType.Directional ? Mathf.Cos(light.spotAngle) : 1f;
                    g_LightColorAngle.Add(lightColorAngle);
                }

                cmd4.SetGlobalVectorArray("g_LightsOriginRange", g_LightsOriginRange);
                cmd4.SetGlobalVectorArray("g_LightColorAngle", g_LightColorAngle);
                cmd4.SetGlobalInt("g_LightsCount", Mathf.Min(MAX_LIGHTS, visibleLights.Length));

                cmd4.SetRenderTarget(target_atlasA ? g_VistaAtlas_A : g_VistaAtlas_B);

                context.ExecuteCommandBuffer(cmd4);
                RenderOpaque(context, m_TexelSpacePass, cameraSortSettings);

                cmd4.Clear();
                if (m_asset.debugPass == TexelSpaceDebugMode.TexelShadingPass)
                {
                    cmd4.Blit(g_VistaAtlas_A, BuiltinRenderTextureType.CameraTarget);
                    context.ExecuteCommandBuffer(cmd4);
                }

                CommandBufferPool.Release(cmd4);

                LogTrace("ReleaseBuffers...");
                CommandBuffer cmd6 = CommandBufferPool.Get("ReleaseBuffers");
                cmd6.ReleaseTemporaryRT(g_PrimitiveVisibilityID);
                context.ExecuteCommandBuffer(cmd6);
                CommandBufferPool.Release(cmd6);

                        #if UNITY_EDITOR
                // Emit scene view UI
                if (camera.cameraType == CameraType.SceneView)
                {
                    ScriptableRenderContext.EmitWorldGeometryForSceneView(camera);
                }
                        #endif
            }

            visibleObjects.Clear();

            // =====================================================================================================
            // Render Vista + Finalize
            // =====================================================================================================

            CommandBuffer cmdVista = CommandBufferPool.Get("Render Vista");
            cmdVista.SetRenderTarget(g_CameraTarget);
            context.ExecuteCommandBuffer(cmdVista);
            cmdVista.Clear();


            context.StartMultiEye(camera);
            switch (m_asset.debugPass)
            {
            case TexelSpaceDebugMode.None:
                cameraSortSettings.criteria = SortingCriteria.OptimizeStateChanges;
                RenderOpaque(context, m_VistaPass, cameraSortSettings);                         // render vista
                context.DrawSkybox(camera);
                break;

            case TexelSpaceDebugMode.VisibilityPassObjectID:
            case TexelSpaceDebugMode.VisibilityPassPrimitivID:
            case TexelSpaceDebugMode.VisibilityPassMipMapPerObject:
            case TexelSpaceDebugMode.VisibilityPassMipMapPerPixel:
                break;

            case TexelSpaceDebugMode.TexelShadingPass:
                cmdVista.Blit(g_VistaAtlas_A, g_CameraTarget);
                context.ExecuteCommandBuffer(cmdVista);
                cmdVista.Clear();
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }
            context.StopMultiEye(camera);
            cmdVista.Blit(g_CameraTarget, BuiltinRenderTextureType.CameraTarget);
            cmdVista.ReleaseTemporaryRT(g_CameraTarget);
            context.ExecuteCommandBuffer(cmdVista);
            CommandBufferPool.Release(cmdVista);
        }

        if (shouldUpdateAtlas)
        {
            timeSinceLastRender = 0f;
        }

        timeSinceLastRender += Time.deltaTime;
        context.Submit();
        if (g_VistaAtlas_A)
        {
            m_asset.memoryConsumption += g_VistaAtlas_A.width * g_VistaAtlas_A.height *
                                         (g_VistaAtlas_A.format == RenderTextureFormat.DefaultHDR ? 8 : 4) * 2;
        }

        m_asset.memoryConsumption /= 1024 * 1024;
    }