public void ExecutePass(DeviceContext context, SimpleSceneWrapper sceneWrapper, Vector3 position) { //using (new GpuProfilePoint(context, "CubemapRender")) { context.PixelShader.SetShaderResource(m_GIVolumeR.m_ShaderResourceView, 5); context.PixelShader.SetShaderResource(m_GIVolumeG.m_ShaderResourceView, 6); context.PixelShader.SetShaderResource(m_GIVolumeB.m_ShaderResourceView, 7); CubemapRenderHelper.RenderCubemap(context, m_CubeObject, m_CubeObjectDepth, sceneWrapper, position, 50.0f, false, new Color4(1.0f, 0.75f, 0.75f, 1.0f)); } //using (new GpuProfilePoint(context, "InitSH")) { context.PixelShader.SetShaderResource(m_CubeObject.m_ShaderResourceView, 0); m_InitialSHSet.BindAsRenderTarget(context); PostEffectHelper.RenderFullscreenTriangle(context, "GIInitSH"); RenderTargetSet.BindNull(context); DownsamplePass(context, m_InitialSHSet, m_Downsampled16x16SHSetR, m_Downsampled16x16SHSetG, m_Downsampled16x16SHSetB); m_Downsampled16x16SHSetR.BindSRV(context, 0); m_Downsampled4x4SHSetR.BindAsRenderTarget(context); PostEffectHelper.RenderFullscreenTriangle(context, "Downsample4x4"); RenderTargetSet.BindNull(context); m_Downsampled16x16SHSetG.BindSRV(context, 0); m_Downsampled4x4SHSetG.BindAsRenderTarget(context); PostEffectHelper.RenderFullscreenTriangle(context, "Downsample4x4"); RenderTargetSet.BindNull(context); m_Downsampled16x16SHSetB.BindSRV(context, 0); m_Downsampled4x4SHSetB.BindAsRenderTarget(context); PostEffectHelper.RenderFullscreenTriangle(context, "Downsample4x4"); RenderTargetSet.BindNull(context); Vector3 sceneMin, sceneMax; sceneWrapper.GetSceneBounds(out sceneMin, out sceneMax); Vector3 positionInVolume = position - sceneMin; positionInVolume.X = positionInVolume.X / (sceneMax.X - sceneMin.X); positionInVolume.Y = positionInVolume.Y / (sceneMax.Y - sceneMin.Y); positionInVolume.Z = positionInVolume.Z / (sceneMax.Z - sceneMin.Z); dynamic scb = m_GIConstantBuffer; scb.g_InjectPosition = new Vector4(new Vector3(positionInVolume.X * (float)(m_VolumeSizeX - 1), positionInVolume.Y * (float)(m_VolumeSizeY - 1), positionInVolume.Z * (float)(m_VolumeSizeZ - 1)), 0); m_GIConstantBuffer.CompileAndBind(context); m_Downsampled4x4SHSetR.BindSRV(context, 2); m_Downsampled4x4SHSetG.BindSRV(context, 3); m_Downsampled4x4SHSetB.BindSRV(context, 4); context.ComputeShader.SetUnorderedAccessView(m_GIVolumeR.m_UnorderedAccessView, 0); context.ComputeShader.SetUnorderedAccessView(m_GIVolumeG.m_UnorderedAccessView, 1); context.ComputeShader.SetUnorderedAccessView(m_GIVolumeB.m_UnorderedAccessView, 2); ShaderManager.ExecuteComputeForSize(context, 1, 1, 1, "InjectSHIntoVolume"); ContextHelper.ClearCSContext(context); } }
public void RenderVolumetricFog(DeviceContext context, TextureObject shadowMap, GlobalIlluminationRenderer giRenderer) { // Not using temporal manager as it was designed for render target sets; TODO TextureObject previousFrameAccumulationTexture = m_Phase ? m_LightingTexturePing : m_LightingTexturePong; TextureObject currentFrameAccumulationTexture = m_Phase ? m_LightingTexturePong : m_LightingTexturePing; m_Phase = !m_Phase; using (new GpuProfilePoint(context, "VolumetricFog")) { #if false using (new GpuProfilePoint(context, "DensityEstimation")) { context.ComputeShader.SetUnorderedAccessView(m_DensityTexture.m_UnorderedAccessView, 0); ShaderManager.ExecuteComputeForResource(context, m_DensityTexture, "CalculateDensity"); ContextHelper.ClearCSContext(context); } #endif using (new GpuProfilePoint(context, "LitFogVolume")) { context.ComputeShader.SetShaderResource(giRenderer.m_GIVolumeR.m_ShaderResourceView, 5); context.ComputeShader.SetShaderResource(giRenderer.m_GIVolumeG.m_ShaderResourceView, 6); context.ComputeShader.SetShaderResource(giRenderer.m_GIVolumeB.m_ShaderResourceView, 7); context.ComputeShader.SetShaderResource(previousFrameAccumulationTexture.m_ShaderResourceView, 8); context.ComputeShader.SetShaderResource(m_DensityTexture.m_ShaderResourceView, 0); context.ComputeShader.SetShaderResource(shadowMap.m_ShaderResourceView, 1); context.ComputeShader.SetUnorderedAccessView(currentFrameAccumulationTexture.m_UnorderedAccessView, 1); ShaderManager.ExecuteComputeForResource(context, currentFrameAccumulationTexture, "LitFogVolume"); ContextHelper.ClearCSContext(context); } using (new GpuProfilePoint(context, "ComputeScattering")) { context.ComputeShader.SetShaderResource(currentFrameAccumulationTexture.m_ShaderResourceView, 0); context.ComputeShader.SetUnorderedAccessView(m_ScatteringTexture.m_UnorderedAccessView, 2); ShaderManager.ExecuteComputeForSize(context, m_VolumeX, m_VolumeY, 1, "ComputeScattering"); ContextHelper.ClearCSContext(context); } } }
public RenderTargetSet ExecutePass(DeviceContext context, RenderTargetSet source) { RenderTargetSet[] luminanceTargets = new RenderTargetSet[6]; luminanceTargets[0] = RenderTargetManager.RequestRenderTargetFromPool(m_RTDescriptorLuminance4x4); luminanceTargets[1] = RenderTargetManager.RequestRenderTargetFromPool(m_RTDescriptorLuminance16x16); luminanceTargets[2] = RenderTargetManager.RequestRenderTargetFromPool(m_RTDescriptorLuminance32x32); luminanceTargets[3] = RenderTargetManager.RequestRenderTargetFromPool(m_RTDescriptorLuminance64x64); luminanceTargets[4] = RenderTargetManager.RequestRenderTargetFromPool(m_RTDescriptorLuminance128x128); luminanceTargets[5] = RenderTargetManager.RequestRenderTargetFromPool(m_RTDescriptorLuminance256x256); using (new GpuProfilePoint(context, "Calculate luminance")) { source.BindSRV(context, 0); luminanceTargets[0].BindAsRenderTarget(context); PostEffectHelper.RenderFullscreenTriangle(context, "Downsample4x4CalculateLuminance"); RenderTargetSet.BindNull(context); ContextHelper.ClearSRVs(context); luminanceTargets[0].BindSRV(context, 0); luminanceTargets[1].BindAsRenderTarget(context); PostEffectHelper.RenderFullscreenTriangle(context, "Downsample4x4Luminance"); RenderTargetSet.BindNull(context); ContextHelper.ClearSRVs(context); luminanceTargets[1].BindSRV(context, 0); luminanceTargets[2].BindAsRenderTarget(context); PostEffectHelper.RenderFullscreenTriangle(context, "Downsample2x2Luminance"); RenderTargetSet.BindNull(context); ContextHelper.ClearSRVs(context); luminanceTargets[2].BindSRV(context, 0); luminanceTargets[3].BindAsRenderTarget(context); PostEffectHelper.RenderFullscreenTriangle(context, "Downsample2x2Luminance"); RenderTargetSet.BindNull(context); ContextHelper.ClearSRVs(context); luminanceTargets[3].BindSRV(context, 0); luminanceTargets[4].BindAsRenderTarget(context); PostEffectHelper.RenderFullscreenTriangle(context, "Downsample2x2Luminance"); RenderTargetSet.BindNull(context); ContextHelper.ClearSRVs(context); luminanceTargets[4].BindSRV(context, 0); luminanceTargets[5].BindAsRenderTarget(context); PostEffectHelper.RenderFullscreenTriangle(context, "Downsample2x2Luminance"); RenderTargetSet.BindNull(context); ContextHelper.ClearSRVs(context); luminanceTargets[5].BindSRV(context, 0); context.ComputeShader.SetUnorderedAccessView(m_FinalLuminance.m_RenderTargets[0].m_UnorderedAccessView, 0); ShaderManager.ExecuteComputeForSize(context, 1, 1, 1, "FinalCalculateAverageLuminance"); ContextHelper.ClearSRVs(context); ContextHelper.ClearCSContext(context); } foreach (var lt in luminanceTargets) { RenderTargetManager.ReleaseRenderTargetToPool(lt); } return(m_FinalLuminance); }