protected override void Render(ScriptableRenderContext renderContext, Camera[] cameras) { bool *propertyCheckedFlags = stackalloc bool[] { false, false, false }; foreach (var i in beforeRenderFrame) { i.func(i.obj); } beforeRenderFrame.Clear(); SceneController.SetState(); #if UNITY_EDITOR foreach (var pair in bakeList) { PipelineCamera pipelineCam = pair.pipelineCamera; for (int i = 0; i < pair.worldToCamera.Length; ++i) { pipelineCam.cam.worldToCameraMatrix = pair.worldToCamera[i]; pipelineCam.cam.projectionMatrix = pair.projection[i]; Render(pipelineCam, new RenderTargetIdentifier(pair.tempTex), ref renderContext, pipelineCam.cam, propertyCheckedFlags); PipelineFunctions.ReleaseRenderTarget(data.buffer, ref pipelineCam.targets); data.buffer.CopyTexture(pair.tempTex, 0, 0, pair.texArray, i, 0); data.ExecuteCommandBuffer(); renderContext.Submit(); } pair.worldToCamera.Dispose(); pair.projection.Dispose(); renderContext.ExecuteCommandBuffer(pair.buffer); pair.buffer.Clear(); renderContext.Submit(); } bakeList.Clear(); #endif if (!PipelineCamera.allCamera.isCreated) { return; } foreach (var cam in cameras) { PipelineCamera pipelineCam; UIntPtr pipelineCamPtr; if (!PipelineCamera.allCamera.Get(cam.gameObject.GetInstanceID(), out pipelineCamPtr)) { #if UNITY_EDITOR if (!PipelineCamera.allCamera.Get(Camera.main.gameObject.GetInstanceID(), out pipelineCamPtr)) { continue; } #else continue; #endif } pipelineCam = MUnsafeUtility.GetObject <PipelineCamera>(pipelineCamPtr.ToPointer()); Render(pipelineCam, BuiltinRenderTextureType.CameraTarget, ref renderContext, cam, propertyCheckedFlags); PipelineFunctions.ReleaseRenderTarget(data.buffer, ref pipelineCam.targets); data.ExecuteCommandBuffer(); renderContext.Submit(); } foreach (var i in afterRenderFrame) { i.func(i.obj); } afterRenderFrame.Clear(); if (bufferAfterFrame.Count > 0) { foreach (var i in bufferAfterFrame) { i(data.buffer); } data.ExecuteCommandBuffer(); bufferAfterFrame.Clear(); renderContext.Submit(); } }
public override void FrameUpdate(PipelineCamera cam, ref PipelineCommandData data) { CommandBuffer buffer = data.buffer; RenderClusterOptions options = new RenderClusterOptions { command = buffer, frustumPlanes = proper.frustumPlanes, cullingShader = data.resources.shaders.gpuFrustumCulling, terrainCompute = data.resources.shaders.terrainCompute }; FilteringSettings alphaTestFilter = new FilteringSettings { layerMask = cam.cam.cullingMask, renderingLayerMask = 1, renderQueueRange = new RenderQueueRange(2450, 2499) }; FilteringSettings opaqueFilter = new FilteringSettings { layerMask = cam.cam.cullingMask, renderingLayerMask = 1, renderQueueRange = new RenderQueueRange(2000, 2449) }; FilteringSettings mvFilter = new FilteringSettings { layerMask = cam.cam.cullingMask, renderingLayerMask = 1, renderQueueRange = RenderQueueRange.opaque }; DrawingSettings depthAlphaTestDrawSettings = new DrawingSettings(new ShaderTagId("Depth"), new SortingSettings(cam.cam) { criteria = SortingCriteria.QuantizedFrontToBack }) { perObjectData = UnityEngine.Rendering.PerObjectData.None, enableDynamicBatching = false, enableInstancing = false }; DrawingSettings depthOpaqueDrawSettings = new DrawingSettings(new ShaderTagId("Depth"), new SortingSettings(cam.cam) { criteria = SortingCriteria.QuantizedFrontToBack }) { perObjectData = UnityEngine.Rendering.PerObjectData.None, enableDynamicBatching = false, enableInstancing = false, overrideMaterial = proper.overrideOpaqueMaterial, overrideMaterialPassIndex = 1 }; DrawingSettings drawSettings = new DrawingSettings(new ShaderTagId("GBuffer"), new SortingSettings(cam.cam) { criteria = SortingCriteria.SortingLayer | SortingCriteria.RenderQueue | SortingCriteria.OptimizeStateChanges }) { perObjectData = UnityEngine.Rendering.PerObjectData.Lightmaps, enableDynamicBatching = false, enableInstancing = false }; DrawingSettings mvDraw = new DrawingSettings(new ShaderTagId("MotionVector"), new SortingSettings { criteria = SortingCriteria.None }) { perObjectData = UnityEngine.Rendering.PerObjectData.None, enableDynamicBatching = false, enableInstancing = false }; //Draw Depth Prepass data.buffer.SetRenderTarget(ShaderIDs._DepthBufferTexture); data.buffer.ClearRenderTarget(true, false, Color.black); cullHandle.Complete(); var lst = CustomDrawRequest.allEvents; foreach (var i in gbufferCullResults) { lst[i].DrawDepthPrepass(buffer); } SceneController.RenderScene(ref data, ref opaqueFilter, ref depthOpaqueDrawSettings, ref proper.cullResults); data.context.DrawRenderers(proper.cullResults, ref depthAlphaTestDrawSettings, ref alphaTestFilter); //Draw GBuffer data.buffer.SetRenderTarget(colors: cam.targets.gbufferIdentifier, depth: ShaderIDs._DepthBufferTexture); data.buffer.ClearRenderTarget(false, true, Color.black); HizOcclusionData hizOccData; if (useHiZ) { hizOccData = IPerCameraData.GetProperty(cam, () => new HizOcclusionData()); SceneController.DrawCluster_LastFrameDepthHiZ(ref options, hizOccData, clusterMat, cam); } foreach (var i in gbufferCullResults) { lst[i].DrawGBuffer(buffer); } SceneController.RenderScene(ref data, ref opaqueFilter, ref drawSettings, ref proper.cullResults); if (useHiZ) { SceneController.DrawCluster_RecheckHiz(ref options, ref hizDepth, hizOccData, clusterMat, linearMat, cam); } //Draw AlphaTest /* SortingSettings st = drawSettings.sortingSettings; * st.criteria = SortingCriteria.SortingLayer | SortingCriteria.RenderQueue | SortingCriteria.OptimizeStateChanges; * drawSettings.sortingSettings = st;*/ SceneController.RenderScene(ref data, ref alphaTestFilter, ref drawSettings, ref proper.cullResults); //Draw Depth data.buffer.Blit(ShaderIDs._DepthBufferTexture, ShaderIDs._CameraDepthTexture); //Draw Motion Vector data.buffer.SetRenderTarget(color: ShaderIDs._CameraMotionVectorsTexture, depth: ShaderIDs._DepthBufferTexture); foreach (var i in gbufferCullResults) { lst[i].DrawMotionVector(buffer); } SceneController.RenderScene(ref data, ref mvFilter, ref mvDraw, ref proper.cullResults); //Draw Static Global Motion Vector data.buffer.DrawMesh(GraphicsUtility.mesh, Matrix4x4.identity, motionVecMat, 0, 0); //Generate DownSampled GBuffer if ((ao != null && ao.Enabled) || (reflection != null && reflection.Enabled && reflection.ssrEvents.enabled)) { int2 res = int2(cam.cam.pixelWidth, cam.cam.pixelHeight) / 2; data.buffer.GetTemporaryRT(ShaderIDs._DownSampledGBuffer1, res.x, res.y, 0, FilterMode.Point, RenderTextureFormat.ARGB32, RenderTextureReadWrite.Linear, 1, false); data.buffer.GetTemporaryRT(ShaderIDs._DownSampledGBuffer2, res.x, res.y, 0, FilterMode.Point, RenderTextureFormat.ARGB2101010, RenderTextureReadWrite.Linear, 1, false); data.buffer.GetTemporaryRT(ShaderIDs._DownSampledDepthTexture, res.x, res.y, 0, FilterMode.Point, RenderTextureFormat.RHalf, RenderTextureReadWrite.Linear, 1, false); downSampledGBuffers[0] = ShaderIDs._DownSampledDepthTexture; downSampledGBuffers[1] = ShaderIDs._DownSampledGBuffer1; downSampledGBuffers[2] = ShaderIDs._DownSampledGBuffer2; data.buffer.SetRenderTarget(colors: downSampledGBuffers, depth: downSampledGBuffers[0]); data.buffer.DrawMesh(GraphicsUtility.mesh, Matrix4x4.identity, downSampleMat, 0, 0); RenderPipeline.ReleaseRTAfterFrame(ShaderIDs._DownSampledGBuffer1); RenderPipeline.ReleaseRTAfterFrame(ShaderIDs._DownSampledGBuffer2); RenderPipeline.ReleaseRTAfterFrame(ShaderIDs._DownSampledDepthTexture); //TODO } }
protected override void Render(ScriptableRenderContext renderContext, Camera[] cameras) { bool *propertyCheckedFlags = stackalloc bool[resources.allEvents.Length]; UnsafeUtility.MemClear(propertyCheckedFlags, resources.allEvents.Length); GraphicsSettings.useScriptableRenderPipelineBatching = resources.useSRPBatcher; SceneController.SetState(); #if UNITY_EDITOR int tempID = Shader.PropertyToID("_TempRT"); foreach (var pair in bakeList) { PipelineCamera pipelineCam = pair.pipelineCamera; for (int i = 0; i < pair.worldToCamera.Length; ++i) { pipelineCam.cam.worldToCameraMatrix = pair.worldToCamera[i]; pipelineCam.cam.projectionMatrix = pair.projection[i]; pipelineCam.cameraTarget = tempID; data.buffer.GetTemporaryRT(tempID, pair.texArray.width, pair.texArray.height, pair.texArray.depth, FilterMode.Point, pair.texArray.format, RenderTextureReadWrite.Linear); Render(pipelineCam, ref renderContext, pipelineCam.cam, propertyCheckedFlags); data.buffer.CopyTexture(tempID, 0, 0, pair.texArray, i, 0); data.buffer.ReleaseTemporaryRT(tempID); data.ExecuteCommandBuffer(); renderContext.Submit(); } pair.worldToCamera.Dispose(); pair.projection.Dispose(); renderContext.ExecuteCommandBuffer(pair.buffer); pair.buffer.Clear(); renderContext.Submit(); } bakeList.Clear(); #endif if (PipelineCamera.allCamera.isCreated) { foreach (var cam in cameras) { PipelineCamera pipelineCam; UIntPtr pipelineCamPtr; if (!PipelineCamera.allCamera.Get(cam.gameObject.GetInstanceID(), out pipelineCamPtr)) { #if UNITY_EDITOR renderingEditor = true; var pos = cam.transform.eulerAngles; pos.z = 0; cam.transform.eulerAngles = pos; if (!PipelineCamera.allCamera.Get(Camera.main.gameObject.GetInstanceID(), out pipelineCamPtr)) { continue; } #else continue; #endif } else { renderingEditor = false; } pipelineCam = MUnsafeUtility.GetObject <PipelineCamera>(pipelineCamPtr.ToPointer()); Render(pipelineCam, ref renderContext, cam, propertyCheckedFlags); data.ExecuteCommandBuffer(); renderContext.Submit(); } if (bufferAfterFrame.Count > 0) { foreach (var i in bufferAfterFrame) { i(data.buffer); } data.ExecuteCommandBuffer(); bufferAfterFrame.Clear(); renderContext.Submit(); } } else { if (bufferAfterFrame.Count > 0) { foreach (var i in bufferAfterFrame) { i(data.buffer); } Graphics.ExecuteCommandBuffer(data.buffer); bufferAfterFrame.Clear(); } } }
public override void FrameUpdate(PipelineCamera cam, ref PipelineCommandData data) { CommandBuffer buffer = data.buffer; RenderClusterOptions options = new RenderClusterOptions { command = buffer, frustumPlanes = proper.frustumPlanes, cullingShader = data.resources.shaders.gpuFrustumCulling, terrainCompute = data.resources.shaders.terrainCompute }; FilteringSettings alphaTestFilter = new FilteringSettings { layerMask = cam.cam.cullingMask, renderingLayerMask = 1, renderQueueRange = new RenderQueueRange(2450, 2499) }; FilteringSettings opaqueFilter = new FilteringSettings { layerMask = cam.cam.cullingMask, renderingLayerMask = 1, renderQueueRange = new RenderQueueRange(2000, 2449) }; FilteringSettings mvFilter = new FilteringSettings { layerMask = cam.cam.cullingMask, renderingLayerMask = 1, renderQueueRange = RenderQueueRange.opaque }; DrawingSettings depthAlphaTestDrawSettings = new DrawingSettings(new ShaderTagId("Depth"), new SortingSettings(cam.cam) { criteria = SortingCriteria.QuantizedFrontToBack | SortingCriteria.OptimizeStateChanges } ) { perObjectData = UnityEngine.Rendering.PerObjectData.None, enableDynamicBatching = false, enableInstancing = false }; DrawingSettings depthOpaqueDrawSettings = new DrawingSettings(new ShaderTagId("Depth"), new SortingSettings(cam.cam) { criteria = SortingCriteria.QuantizedFrontToBack }) { perObjectData = UnityEngine.Rendering.PerObjectData.None, enableDynamicBatching = false, enableInstancing = false, overrideMaterial = proper.overrideOpaqueMaterial, overrideMaterialPassIndex = 1 }; DrawingSettings drawSettings = new DrawingSettings(new ShaderTagId("GBuffer"), new SortingSettings(cam.cam) { criteria = SortingCriteria.RenderQueue | SortingCriteria.OptimizeStateChanges }) { perObjectData = UnityEngine.Rendering.PerObjectData.Lightmaps, enableDynamicBatching = false, enableInstancing = false }; DrawingSettings mvDraw = new DrawingSettings(new ShaderTagId("MotionVector"), new SortingSettings { criteria = SortingCriteria.OptimizeStateChanges }) { perObjectData = UnityEngine.Rendering.PerObjectData.None, enableDynamicBatching = false, enableInstancing = false }; //Draw Depth Prepass data.buffer.SetRenderTarget(ShaderIDs._DepthBufferTexture); data.buffer.ClearRenderTarget(true, false, Color.black); cullHandle.Complete(); var lst = CustomDrawRequest.allEvents; foreach (var i in gbufferCullResults) { lst[i].DrawDepthPrepass(buffer); } HizOcclusionData hizOccData = null; PipelineFunctions.UpdateFrustumMinMaxPoint(buffer, proper.frustumMinPoint, proper.frustumMaxPoint); if (useHiZ && SceneController.gpurpEnabled) { #if UNITY_EDITOR if (Application.isPlaying) { #endif hizOccData = IPerCameraData.GetProperty(cam, () => new HizOcclusionData()); SceneController.CullCluster_LastFrameDepthHiZ(ref options, hizOccData, cam); buffer.DrawProceduralIndirect(Matrix4x4.identity, clusterMat, 2, MeshTopology.Triangles, SceneController.baseBuffer.instanceCountBuffer, 0); #if UNITY_EDITOR } #endif } SceneController.RenderScene(ref data, ref opaqueFilter, ref depthOpaqueDrawSettings, ref proper.cullResults); data.context.DrawRenderers(proper.cullResults, ref depthAlphaTestDrawSettings, ref alphaTestFilter); decalEvt.FrameUpdate(cam, ref data); //Draw GBuffer data.buffer.SetRenderTarget(colors: cam.targets.gbufferIdentifier, depth: ShaderIDs._DepthBufferTexture); data.buffer.ClearRenderTarget(false, true, Color.black); foreach (var i in gbufferCullResults) { lst[i].DrawGBuffer(buffer); } if (useHiZ && SceneController.gpurpEnabled) { #if UNITY_EDITOR if (Application.isPlaying) { #endif buffer.SetGlobalBuffer(ShaderIDs._MaterialBuffer, data.resources.clusterResources.vmManager.materialBuffer); buffer.SetGlobalTexture(ShaderIDs._GPURPMainTex, data.resources.clusterResources.albedoPool.rt); buffer.SetGlobalTexture(ShaderIDs._GPURPSpecularMap, data.resources.clusterResources.smoPool.rt); buffer.SetGlobalTexture(ShaderIDs._GPURPEmissionMap, data.resources.clusterResources.emissionPool.rt); buffer.SetGlobalTexture(ShaderIDs._GPURPBumpMap, data.resources.clusterResources.normalPool.rt); buffer.SetGlobalTexture(ShaderIDs._GPURPHeightMap, data.resources.clusterResources.heightPool.rt); buffer.DrawProceduralIndirect(Matrix4x4.identity, clusterMat, 0, MeshTopology.Triangles, SceneController.baseBuffer.instanceCountBuffer, 0); #if UNITY_EDITOR } #endif } SceneController.RenderScene(ref data, ref opaqueFilter, ref drawSettings, ref proper.cullResults); if (useHiZ && SceneController.gpurpEnabled) { #if UNITY_EDITOR if (Application.isPlaying) #endif SceneController.DrawCluster_RecheckHiz(ref options, ref hizDepth, hizOccData, clusterMat, linearMat, cam); } if (MTerrain.current) { MTerrain.current.DrawTerrain(buffer, 0, proper.frustumPlanes); } //Draw AlphaTest /* SortingSettings st = drawSettings.sortingSettings; * st.criteria = SortingCriteria.SortingLayer | SortingCriteria.RenderQueue | SortingCriteria.OptimizeStateChanges; * drawSettings.sortingSettings = st;*/ SceneController.RenderScene(ref data, ref alphaTestFilter, ref drawSettings, ref proper.cullResults); //Draw Depth data.buffer.Blit(ShaderIDs._DepthBufferTexture, ShaderIDs._CameraDepthTexture); //Draw Motion Vector data.buffer.SetRenderTarget(color: ShaderIDs._CameraMotionVectorsTexture, depth: ShaderIDs._DepthBufferTexture); foreach (var i in gbufferCullResults) { lst[i].DrawMotionVector(buffer); } SceneController.RenderScene(ref data, ref mvFilter, ref mvDraw, ref proper.cullResults); //Draw Static Global Motion Vector data.buffer.DrawMesh(GraphicsUtility.mesh, Matrix4x4.identity, motionVecMat, 0, 0); }
private void Update() { SceneController.Update(this); loadingThread.Update(SceneController.commandQueue); }
protected override void Render(ScriptableRenderContext renderContext, Camera[] cameras) { bool *propertyCheckedFlags = stackalloc bool[resources.allEvents.Length]; bool needSubmit = false; CustomDrawRequest.Initialize(); UnsafeUtility.MemClear(propertyCheckedFlags, resources.allEvents.Length); GraphicsSettings.useScriptableRenderPipelineBatching = resources.useSRPBatcher; SceneController.SetState(); data.context = renderContext; data.resources = resources; if (motionVectorMatricesBuffer == null || !motionVectorMatricesBuffer.IsValid()) { motionVectorMatricesBuffer = new ComputeBuffer(MotionVectorDrawer.Capacity, sizeof(float3x4)); } else if (motionVectorMatricesBuffer.count < MotionVectorDrawer.Capacity) { motionVectorMatricesBuffer.Dispose(); motionVectorMatricesBuffer = new ComputeBuffer(MotionVectorDrawer.Capacity, sizeof(float3x4)); } MotionVectorDrawer.ExecuteBeforeFrame(motionVectorMatricesBuffer); data.buffer.SetGlobalBuffer(ShaderIDs._LastFrameModel, motionVectorMatricesBuffer); #if UNITY_EDITOR int tempID = Shader.PropertyToID("_TempRT"); foreach (var pair in bakeList) { PipelineCamera pipelineCam = pair.pipelineCamera; for (int i = 0; i < pair.worldToCamera.Length; ++i) { pipelineCam.cam.worldToCameraMatrix = pair.worldToCamera[i]; pipelineCam.cam.projectionMatrix = pair.projection[i]; pipelineCam.cameraTarget = tempID; data.buffer.GetTemporaryRT(tempID, pair.texArray.width, pair.texArray.height, pair.texArray.depth, FilterMode.Point, pair.texArray.format, RenderTextureReadWrite.Linear); Render(pipelineCam, ref renderContext, pipelineCam.cam, propertyCheckedFlags); data.buffer.CopyTexture(tempID, 0, 0, pair.texArray, i, 0); data.buffer.ReleaseTemporaryRT(tempID); data.ExecuteCommandBuffer(); renderContext.Submit(); needSubmit = false; } pair.worldToCamera.Dispose(); pair.projection.Dispose(); renderContext.ExecuteCommandBuffer(pair.buffer); pair.buffer.Clear(); renderContext.Submit(); needSubmit = false; } bakeList.Clear(); #endif foreach (var cam in preFrameRenderCamera) { Render(cam, ref renderContext, cam.cam, propertyCheckedFlags); data.ExecuteCommandBuffer(); renderContext.Submit(); needSubmit = false; } preFrameRenderCamera.Clear(); if (CustomDrawRequest.allEvents.Count > 0 || JobProcessEvent.allEvents.Count > 0) { foreach (var i in CustomDrawRequest.allEvents) { i.PrepareJob(resources); } foreach (var i in JobProcessEvent.allEvents) { i.PrepareJob(); } JobHandle.ScheduleBatchedJobs(); foreach (var i in CustomDrawRequest.allEvents) { i.FinishJob(); } } if (useBeforeFrameBuffer) { renderContext.ExecuteCommandBuffer(m_beforeFrameBuffer); m_beforeFrameBuffer.Clear(); needSubmit = true; useBeforeFrameBuffer = false; } foreach (var cam in cameras) { PipelineCamera pipelineCam = cam.GetComponent <PipelineCamera>(); if (!pipelineCam) { #if UNITY_EDITOR if (cam.cameraType == CameraType.SceneView) { renderingEditor = true; var pos = cam.transform.eulerAngles; pos.z = 0; cam.transform.eulerAngles = pos; if (!Camera.main || !(pipelineCam = Camera.main.GetComponent <PipelineCamera>())) { continue; } } else if (cam.cameraType == CameraType.Game) { renderingEditor = false; pipelineCam = cam.gameObject.AddComponent <PipelineCamera>(); } else { continue; } #else renderingEditor = false; pipelineCam = cam.gameObject.AddComponent <PipelineCamera>(); #endif } else { renderingEditor = false; } Render(pipelineCam, ref renderContext, cam, propertyCheckedFlags); data.ExecuteCommandBuffer(); #if UNITY_EDITOR if (renderingEditor) { renderContext.DrawGizmos(cam, GizmoSubset.PostImageEffects); } #endif renderContext.Submit(); needSubmit = false; } if (useAfterFrameBuffer) { renderContext.ExecuteCommandBuffer(m_afterFrameBuffer); m_afterFrameBuffer.Clear(); needSubmit = true; useAfterFrameBuffer = false; } if (needSubmit) { renderContext.Submit(); } MotionVectorDrawer.ExecuteAfterFrame(); foreach (var i in JobProcessEvent.allEvents) { i.FinishJob(); } }
protected override void Render(ScriptableRenderContext renderContext, Camera[] cameras) { currentFrameCamera.Clear(); foreach (var cam in cameras) { CameraSetting csg; ulong pipelineCamPtr; if (!PipelineCamera.CameraSearchDict.Get(cam.gameObject.GetInstanceID(), out pipelineCamPtr)) { if (!cam.TryGetComponent(out csg.pipeCam)) { #if UNITY_EDITOR if (cam.cameraType == CameraType.SceneView) { csg.isRenderingEditor = true; var pos = cam.transform.eulerAngles; pos.z = 0; cam.transform.eulerAngles = pos; if (!Camera.main || !(csg.pipeCam = Camera.main.GetComponent <PipelineCamera>())) { continue; } } else if (cam.cameraType == CameraType.Game) { csg.isRenderingEditor = false; csg.pipeCam = cam.gameObject.AddComponent <PipelineCamera>(); } else { continue; } #else csg.isRenderingEditor = false; csg.pipeCam = cam.gameObject.AddComponent <PipelineCamera>(); #endif } else { csg.isRenderingEditor = false; csg.pipeCam.AddToDict(); } } else { csg.isRenderingEditor = false; csg.pipeCam = MUnsafeUtility.GetObject <PipelineCamera>((void *)pipelineCamPtr); } csg.cam = cam; csg.pipeCam.cam = cam; csg.pipeCam.BeforeFrameRendering(); currentFrameCamera.Add(csg); } bool *propertyCheckedFlags = stackalloc bool[resources.allEvents.Length]; bool needSubmit = false; CustomDrawRequest.Initialize(); UnsafeUtility.MemClear(propertyCheckedFlags, resources.allEvents.Length); SceneController.SetState(); data.context = renderContext; data.resources = resources; if (motionVectorMatricesBuffer == null || !motionVectorMatricesBuffer.IsValid()) { motionVectorMatricesBuffer = new ComputeBuffer(MotionVectorDrawer.Capacity, sizeof(float3x4)); } else if (motionVectorMatricesBuffer.count < MotionVectorDrawer.Capacity) { motionVectorMatricesBuffer.Dispose(); motionVectorMatricesBuffer = new ComputeBuffer(MotionVectorDrawer.Capacity, sizeof(float3x4)); } MotionVectorDrawer.ExecuteBeforeFrame(motionVectorMatricesBuffer); data.buffer.SetGlobalBuffer(ShaderIDs._LastFrameModel, motionVectorMatricesBuffer); #if UNITY_EDITOR int tempID = Shader.PropertyToID("_TempRT"); foreach (var pair in bakeList) { PipelineCamera pipelineCam = pair.pipelineCamera; for (int i = 0; i < pair.worldToCamera.Length; ++i) { pipelineCam.cam.worldToCameraMatrix = pair.worldToCamera[i]; pipelineCam.cam.projectionMatrix = pair.projection[i]; pipelineCam.cameraTarget = tempID; data.buffer.GetTemporaryRT(tempID, pair.texArray.width, pair.texArray.height, pair.texArray.depth, FilterMode.Point, pair.texArray.format, RenderTextureReadWrite.Linear); Render(pipelineCam, ref renderContext, pipelineCam.cam, propertyCheckedFlags); data.buffer.CopyTexture(tempID, 0, 0, pair.texArray, i, 0); data.buffer.ReleaseTemporaryRT(tempID); data.ExecuteCommandBuffer(); renderContext.Submit(); needSubmit = false; } pair.worldToCamera.Dispose(); pair.projection.Dispose(); renderContext.ExecuteCommandBuffer(pair.buffer); pair.buffer.Clear(); renderContext.Submit(); needSubmit = false; } bakeList.Clear(); #endif foreach (var cam in preFrameRenderCamera) { Render(cam, ref renderContext, cam.cam, propertyCheckedFlags); data.ExecuteCommandBuffer(); renderContext.Submit(); needSubmit = false; } preFrameRenderCamera.Clear(); if (CustomDrawRequest.allEvents.Count > 0 || JobProcessEvent.allEvents.Count > 0) { foreach (var i in CustomDrawRequest.allEvents) { i.PrepareJob(resources); } foreach (var i in JobProcessEvent.allEvents) { i.PrepareJob(); } JobHandle.ScheduleBatchedJobs(); foreach (var i in CustomDrawRequest.allEvents) { i.FinishJob(); } foreach (var i in JobProcessEvent.allEvents) { i.FinishJob(); } } if (Application.isPlaying && resources.clusterResources) { resources.clusterResources.UpdateData(data.buffer, resources); } resources.loadingThread.Update(); if (useBeforeFrameBuffer) { renderContext.ExecuteCommandBuffer(m_beforeFrameBuffer); m_beforeFrameBuffer.Clear(); needSubmit = true; useBeforeFrameBuffer = false; } if (iRunnableObjects.isCreated) { foreach (var i in iRunnableObjects) { IPipelineRunnable func = MUnsafeUtility.GetObject <IPipelineRunnable>((void *)i.value); func.PipelineUpdate(ref data); } } if (cameras.Length > 0) { data.buffer.SetGlobalVector(ShaderIDs._SceneOffset, new float4(sceneOffset, 1)); } foreach (var cam in currentFrameCamera) { renderingEditor = cam.isRenderingEditor; Render(cam.pipeCam, ref renderContext, cam.cam, propertyCheckedFlags); data.ExecuteCommandBuffer(); #if UNITY_EDITOR if (renderingEditor) { renderContext.DrawGizmos(cam.cam, GizmoSubset.PostImageEffects); } #endif renderContext.Submit(); needSubmit = false; } if (useAfterFrameBuffer) { renderContext.ExecuteCommandBuffer(m_afterFrameBuffer); m_afterFrameBuffer.Clear(); needSubmit = true; useAfterFrameBuffer = false; } if (needSubmit) { renderContext.Submit(); } MotionVectorDrawer.ExecuteAfterFrame(); sceneOffset = 0; foreach (var cam in currentFrameCamera) { cam.pipeCam.cam = cam.cam; cam.pipeCam.AfterFrameRendering(); } }
public void Awake(MonoBehaviour behavior) { current = this; addList = new NativeList <ulong>(10, Allocator.Persistent); this.behavior = behavior; baseBuffer = new PipelineBaseBuffer(); clusterResources = Resources.Load <ClusterMatResources>("MapMat/" + mapResources); int clusterCount = 0; allScenes = new List <SceneStreaming>(clusterResources.clusterProperties.Count); foreach (var i in clusterResources.clusterProperties) { clusterCount += i.clusterCount; allScenes.Add(new SceneStreaming(i)); } PipelineFunctions.InitBaseBuffer(baseBuffer, clusterResources, mapResources, clusterCount); pointerContainer = new NativeList <ulong>(clusterCount, Allocator.Persistent); commandQueue = new LoadingCommandQueue(); RenderTextureDescriptor desc = new RenderTextureDescriptor { autoGenerateMips = false, bindMS = false, colorFormat = RenderTextureFormat.ARGB32, depthBufferBits = 0, dimension = TextureDimension.Tex2DArray, enableRandomWrite = false, height = resolution, width = resolution, memoryless = RenderTextureMemoryless.None, msaaSamples = 1, vrUsage = VRTextureUsage.None, volumeDepth = texArrayCapacity, shadowSamplingMode = ShadowSamplingMode.None, sRGB = false, useMipMap = false }; commonData = new SceneCommonData { texDict = new Dictionary <string, SceneCommonData.TextureIdentifier>(), avaiableProperties = new NativeList <int>(propertyCapacity, Allocator.Persistent), avaiableTexs = new NativeList <int>(texArrayCapacity, Allocator.Persistent), texCopyBuffer = new ComputeBuffer(resolution * resolution, sizeof(int)), propertyBuffer = new ComputeBuffer(propertyCapacity, sizeof(PropertyValue)), copyTextureMat = new Material(RenderPipeline.current.resources.copyShader), texArray = new RenderTexture(desc), clusterMaterial = new Material(RenderPipeline.current.resources.clusterRenderShader), terrainMaterial = new Material(RenderPipeline.current.resources.terrainShader), terrainDrawStreaming = new TerrainDrawStreaming(100, 16, RenderPipeline.current.resources.terrainCompute) }; commonData.clusterMaterial.SetBuffer(ShaderIDs._PropertiesBuffer, commonData.propertyBuffer); commonData.clusterMaterial.SetTexture(ShaderIDs._MainTex, commonData.texArray); commonData.copyTextureMat.SetVector("_TextureSize", new Vector4(resolution, resolution)); commonData.copyTextureMat.SetBuffer("_TextureBuffer", commonData.texCopyBuffer); for (int i = 0; i < propertyCapacity; ++i) { commonData.avaiableProperties.Add(i); } for (int i = 0; i < texArrayCapacity; ++i) { commonData.avaiableTexs.Add(i); } testNodeArray = new NativeList <ulong>(terrainTransforms.Length, Allocator.Persistent); foreach (var i in terrainTransforms) { TerrainQuadTree.QuadTreeNode *testNode = (TerrainQuadTree.QuadTreeNode *)UnsafeUtility.Malloc(sizeof(TerrainQuadTree.QuadTreeNode), 16, Allocator.Persistent); testNode->listPosition = -1; ref TerrainPanel panel = ref testNode->panel; if (i.localScale.x > 1.1f) { panel.edgeFlag = 0; } else { panel.edgeFlag = 15; } panel.extent = i.localScale * 0.5f; panel.position = i.position; panel.textureIndex = 0; panel.heightMapIndex = 0; testNodeArray.Add((ulong)testNode); }
protected override void Render(ScriptableRenderContext renderContext, Camera[] cameras) { bool *propertyCheckedFlags = stackalloc bool[] { false, false, false }; foreach (var i in beforeRenderFrame) { i.func(i.obj); } beforeRenderFrame.Clear(); SceneController.SetState(); #if UNITY_EDITOR foreach (var pair in bakeList) { PipelineCamera pipelineCam = pair.pipelineCamera; for (int i = 0; i < pair.worldToCamera.Length; ++i) { pipelineCam.cam.worldToCameraMatrix = pair.worldToCamera[i]; pipelineCam.cam.projectionMatrix = pair.projection[i]; Render(pipelineCam, new RenderTargetIdentifier(pair.tempTex), ref renderContext, pipelineCam.cam, propertyCheckedFlags); PipelineFunctions.ReleaseRenderTarget(data.buffer, ref pipelineCam.targets); data.buffer.CopyTexture(pair.tempTex, 0, pair.texArray, i); data.ExecuteCommandBuffer(); } pair.worldToCamera.Dispose(); pair.projection.Dispose(); renderContext.ExecuteCommandBuffer(pair.buffer); pair.buffer.Clear(); renderContext.Submit(); } bakeList.Clear(); #endif foreach (var cam in cameras) { PipelineCamera pipelineCam = cam.GetComponent <PipelineCamera>(); if (!pipelineCam) { pipelineCam = Camera.main.GetComponent <PipelineCamera>(); if (!pipelineCam) { continue; } } Render(pipelineCam, BuiltinRenderTextureType.CameraTarget, ref renderContext, cam, propertyCheckedFlags); PipelineFunctions.ReleaseRenderTarget(data.buffer, ref pipelineCam.targets); data.ExecuteCommandBuffer(); renderContext.Submit(); } foreach (var i in afterRenderFrame) { i.func(i.obj); } afterRenderFrame.Clear(); #if UNITY_EDITOR foreach (var i in bufferAfterFrame) { renderContext.ExecuteCommandBuffer(i); i.Clear(); } bufferAfterFrame.Clear(); renderContext.Submit(); #endif }
private void OnDestroy() { SceneController.Dispose(); current = null; }
private void Update() { SceneController.Update(this); }