public void Init(PipelineResources resources) { noiseTexture = new RenderTexture(new RenderTextureDescriptor { autoGenerateMips = false, useMipMap = false, bindMS = false, colorFormat = RenderTextureFormat.ARGBHalf, depthBufferBits = 0, dimension = TextureDimension.Tex3D, enableRandomWrite = true, height = resolution, width = resolution, volumeDepth = resolution, msaaSamples = 1 }); value = 0; noiseTexture.filterMode = FilterMode.Bilinear; noiseTexture.Create(); shader = resources.shaders.voxelNoise; Random r = new Random((uint)System.Guid.NewGuid().GetHashCode()); Shader.SetGlobalVector(ShaderIDs._RandomSeed, (float4)(r.NextDouble4() * 10000 + 1000)); shader.SetTexture(1, ShaderIDs._VolumetricNoise, noiseTexture); shader.Dispatch(1, dispatchCount, dispatchCount, dispatchCount); }
private void RenderScreenSpaceReflection(CommandBuffer ScreenSpaceReflectionBuffer, SSRCameraData camData, PipelineCamera cam) { Vector2Int resolution = new Vector2Int(cam.cam.pixelWidth, cam.cam.pixelHeight); //////Gte HiZ_DEPTHrt////// ScreenSpaceReflectionBuffer.CopyTexture(ShaderIDs._CameraDepthTexture, 0, 0, camData.SSR_HierarchicalDepth_RT, 0, 0); for (int i = 1; i < HiZ_MaxLevel + 1; ++i) { ScreenSpaceReflectionBuffer.SetGlobalInt(SSR_HiZ_PrevDepthLevel_ID, i - 1); ScreenSpaceReflectionBuffer.SetRenderTarget(camData.SSR_HierarchicalDepth_BackUp_RT, i); ScreenSpaceReflectionBuffer.DrawMesh(GraphicsUtility.mesh, Matrix4x4.identity, StochasticScreenSpaceReflectionMaterial, 0, 0); ScreenSpaceReflectionBuffer.CopyTexture(camData.SSR_HierarchicalDepth_BackUp_RT, 0, i, camData.SSR_HierarchicalDepth_RT, 0, i); } ScreenSpaceReflectionBuffer.SetGlobalTexture(SSR_HierarchicalDepth_ID, camData.SSR_HierarchicalDepth_RT); //////Set SceneColorRT////// ScreenSpaceReflectionBuffer.CopyTexture(cam.targets.renderTargetIdentifier, 0, 0, cam.targets.backupIdentifier, 0, 0); ScreenSpaceReflectionBuffer.SetGlobalTexture(SSR_SceneColor_ID, cam.targets.backupIdentifier); ScreenSpaceReflectionBuffer.GetTemporaryRT(SSR_Trace_ID, resolution.x / 2, resolution.y / 2, 0, FilterMode.Point, RenderTextureFormat.ARGBHalf, RenderTextureReadWrite.Linear); ScreenSpaceReflectionBuffer.GetTemporaryRT(SSR_GetSSRColor_ID, resolution.x, resolution.y, 0, FilterMode.Bilinear, RenderTextureFormat.ARGBHalf, RenderTextureReadWrite.Linear); ScreenSpaceReflectionBuffer.SetGlobalVector(ShaderIDs._RandomSeed, (float4)(rand.NextDouble4())); ScreenSpaceReflectionBuffer.BlitSRT(SSR_Trace_ID, StochasticScreenSpaceReflectionMaterial, 1); //////GetSSRColor////// ScreenSpaceReflectionBuffer.BlitSRT(SSR_GetSSRColor_ID, StochasticScreenSpaceReflectionMaterial, 2); //////Temporal filter////// ScreenSpaceReflectionBuffer.GetTemporaryRT(SSR_TemporalCurr_ID, resolution.x, resolution.y, 0, FilterMode.Bilinear, RenderTextureFormat.ARGBHalf, RenderTextureReadWrite.Linear); ScreenSpaceReflectionBuffer.SetGlobalTexture(SSR_TemporalPrev_ID, camData.SSR_TemporalPrev_RT); ScreenSpaceReflectionBuffer.SetGlobalTexture(ShaderIDs._LastFrameDepthTexture, prevDepthData.SSR_PrevDepth_RT); ScreenSpaceReflectionBuffer.BlitSRT(SSR_TemporalCurr_ID, StochasticScreenSpaceReflectionMaterial, 3); ScreenSpaceReflectionBuffer.CopyTexture(SSR_TemporalCurr_ID, 0, 0, camData.SSR_TemporalPrev_RT, 0, 0); if (prevDepthData.targetObject == this) { prevDepthData.UpdateCameraSize(resolution); ScreenSpaceReflectionBuffer.CopyTexture(ShaderIDs._CameraDepthTexture, 0, 0, prevDepthData.SSR_PrevDepth_RT, 0, 0); } ScreenSpaceReflectionBuffer.ReleaseTemporaryRT(SSR_Trace_ID); ScreenSpaceReflectionBuffer.ReleaseTemporaryRT(SSR_GetSSRColor_ID); }
public override void FrameUpdate(PipelineCamera cam, ref PipelineCommandData data) { CommandBuffer buffer = data.buffer; ComputeShader scatter = data.resources.volumetricScattering; if (cbdr.lightFlag == 0) { cbdr.cubemapShadowArray = null; cbdr.dirLightShadowmap = null; return; } int pass = 0; if (cbdr.cubemapShadowArray != null) { pass |= 0b001; } if (cbdr.dirLightShadowmap != null) { pass |= 0b010; } buffer.SetGlobalFloat(ShaderIDs._MaxDistance, availableDistance); buffer.SetGlobalInt(ShaderIDs._FrameCount, Time.frameCount); HistoryVolumetric historyVolume = IPerCameraData.GetProperty(cam, () => new HistoryVolumetric()); //Volumetric Light RenderTextureDescriptor desc = new RenderTextureDescriptor { autoGenerateMips = false, bindMS = false, colorFormat = RenderTextureFormat.ARGBHalf, depthBufferBits = 0, dimension = TextureDimension.Tex3D, enableRandomWrite = true, height = downSampledSize.y, width = downSampledSize.x, memoryless = RenderTextureMemoryless.None, msaaSamples = 1, shadowSamplingMode = ShadowSamplingMode.None, sRGB = false, useMipMap = false, volumeDepth = downSampledSize.z, vrUsage = VRTextureUsage.None }; buffer.GetTemporaryRT(ShaderIDs._VolumeTex, desc, FilterMode.Bilinear); if (!historyVolume.lastVolume) { historyVolume.lastVolume = new RenderTexture(desc); historyVolume.lastVolume.filterMode = FilterMode.Bilinear; historyVolume.lastVolume.wrapMode = TextureWrapMode.Clamp; historyVolume.lastVolume.Create(); buffer.SetGlobalFloat(ShaderIDs._TemporalWeight, 0); } else { if (historyVolume.lastVolume.volumeDepth != desc.volumeDepth) { historyVolume.lastVolume.Release(); historyVolume.lastVolume.volumeDepth = desc.volumeDepth; historyVolume.lastVolume.Create(); buffer.SetGlobalFloat(ShaderIDs._TemporalWeight, 0); } else { buffer.SetGlobalFloat(ShaderIDs._TemporalWeight, 0.7f); } } buffer.SetGlobalVector(ShaderIDs._NearFarClip, new Vector4(cam.cam.farClipPlane / availableDistance, cam.cam.nearClipPlane / availableDistance, cam.cam.nearClipPlane)); buffer.SetGlobalVector(ShaderIDs._Screen_TexelSize, new Vector4(1f / cam.cam.pixelWidth, 1f / cam.cam.pixelHeight, cam.cam.pixelWidth, cam.cam.pixelHeight)); buffer.SetComputeBufferParam(scatter, pass, ShaderIDs._AllPointLight, cbdr.allPointLightBuffer); buffer.SetComputeTextureParam(scatter, pass, ShaderIDs._FroxelTileLightList, cbdr.froxelTileLightList); buffer.SetComputeBufferParam(scatter, pass, ShaderIDs._RandomBuffer, randomBuffer); buffer.SetComputeTextureParam(scatter, pass, ShaderIDs._VolumeTex, ShaderIDs._VolumeTex); buffer.SetComputeTextureParam(scatter, scatterPass, ShaderIDs._VolumeTex, ShaderIDs._VolumeTex); buffer.SetComputeTextureParam(scatter, pass, ShaderIDs._LastVolume, historyVolume.lastVolume); buffer.SetComputeTextureParam(scatter, pass, ShaderIDs._DirShadowMap, cbdr.dirLightShadowmap); buffer.SetComputeTextureParam(scatter, pass, ShaderIDs._CubeShadowMapArray, cbdr.cubemapShadowArray); buffer.SetGlobalVector(ShaderIDs._RandomSeed, (float4)(rand.NextDouble4() * 1000 + 100)); cbdr.cubemapShadowArray = null; cbdr.dirLightShadowmap = null; buffer.SetComputeIntParam(scatter, ShaderIDs._LightFlag, (int)cbdr.lightFlag); buffer.DispatchCompute(scatter, pass, downSampledSize.x / 8, downSampledSize.y / 2, downSampledSize.z / marchStep); buffer.CopyTexture(ShaderIDs._VolumeTex, historyVolume.lastVolume); buffer.DispatchCompute(scatter, scatterPass, downSampledSize.x / 32, downSampledSize.y / 2, 1); buffer.BlitSRT(cam.targets.renderTargetIdentifier, volumeMat, 0); buffer.ReleaseTemporaryRT(ShaderIDs._VolumeTex); cbdr.lightFlag = 0; PipelineFunctions.ExecuteCommandBuffer(ref data); }