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); } }
private static void UpdateGlobalConstantBuffer(DeviceContext context, CustomConstantBufferInstance globalFrameConstantBuffer, CSharpRendererMainForm form) { dynamic gfcb = globalFrameConstantBuffer; Random rand = new Random(); gfcb.g_Time = (float)m_Time; gfcb.g_FrameRandoms = new Vector4((float)rand.NextDouble(), (float)rand.NextDouble(), (float)rand.NextDouble(), (float)rand.NextDouble()); gfcb.g_FrameNumber = m_FrameNumber; gfcb.g_GPUDebugOn = SurfaceDebugManager.m_GPUDebugOn ? 1.0f : 0.0f; gfcb.g_GPUDebugOverridePositionEnable = form.GetGPUDebuggingOverridePos() ? 1.0f : 0.0f; gfcb.g_GPUDebugOverridePositionXYZ = new Vector4((float)form.GetGPUDebuggingOverridePosX(), (float)form.GetGPUDebuggingOverridePosY(), (float)form.GetGPUDebuggingOverridePosZ(), 0.0f); globalFrameConstantBuffer.CompileAndBind(context); }
public void ExecutePass(DeviceContext context, RenderTargetSet target, RenderTargetSet linearDepth, RenderTargetSet motionVectors) { RenderTargetSet ssaoCurrent = TemporalSurfaceManager.GetRenderTargetCurrent("SSAO"); RenderTargetSet ssaoHistory = TemporalSurfaceManager.GetRenderTargetHistory("SSAO"); RenderTargetSet tempBlurBuffer = RenderTargetManager.RequestRenderTargetFromPool(m_RTDescriptor); Random rand = new Random(); dynamic scb = m_SSAOBuffer; scb.g_SSAOPhase = (float)rand.NextDouble() * 3.1415f; m_SSAOBuffer.CompileAndBind(context); using (new GpuProfilePoint(context, "SSAO")) { using (new GpuProfilePoint(context, "SSAOCalculate")) { linearDepth.BindSRV(context, 0); ssaoHistory.BindSRV(context, 1); motionVectors.BindSRV(context, 2); ssaoCurrent.BindAsRenderTarget(context); PostEffectHelper.RenderFullscreenTriangle(context, "SSAOCalculate"); RenderTargetSet.BindNull(context); ContextHelper.ClearSRVs(context); } SurfaceDebugManager.RegisterDebug(context, "SSAOMain", ssaoCurrent); using (new GpuProfilePoint(context, "SSAOBlur")) { ssaoCurrent.BindSRV(context, 1); tempBlurBuffer.BindAsRenderTarget(context); PostEffectHelper.RenderFullscreenTriangle(context, "SSAOBlurHorizontal"); RenderTargetSet.BindNull(context); ContextHelper.ClearSRVs(context); SurfaceDebugManager.RegisterDebug(context, "SSAOBlurH", tempBlurBuffer); tempBlurBuffer.BindSRV(context, 1); target.BindAsRenderTarget(context); PostEffectHelper.RenderFullscreenTriangle(context, "SSAOBlurVertical"); RenderTargetSet.BindNull(context); ContextHelper.ClearSRVs(context); SurfaceDebugManager.RegisterDebug(context, "SSAOBlurV", target); } } RenderTargetManager.ReleaseRenderTargetToPool(tempBlurBuffer); }
public static void GenerateCubemapMips(DeviceContext context, string shader, TextureObject targetTexture, TextureObject sourceTexture) { for (int m = 0; m < targetTexture.m_Mips; ++m) { for (int i = 0; i < 6; ++i) { dynamic cdb = m_CubemapDownsampleBuffer; cdb.g_Mip = (float)m; cdb.g_Face = i; m_CubemapDownsampleBuffer.CompileAndBind(context); RenderTargetSet.BindTextureAsRenderTarget(context, targetTexture.m_ArrayRenderTargetViews[m * 6 + i], null, targetTexture.m_Width >> m, targetTexture.m_Height >> m); context.PixelShader.SetShaderResource(PostEffectHelper.m_RandomNumbersBuffer.m_ShaderResourceView, 39); context.PixelShader.SetShaderResource(sourceTexture.m_ShaderResourceView, 0); PostEffectHelper.RenderFullscreenTriangle(context, shader); RenderTargetSet.BindNull(context); } } }
public static void RenderCubemap(DeviceContext context, TextureObject targetTexture, TextureObject targetDepth, SimpleSceneWrapper sceneWrapper, Vector3 position, float range, bool depthOnly = false, Color4 clearColor = new Color4()) { //using (new GpuProfilePoint(context, "CubemapRendering")) { // some hardcoded near plane Matrix projectionMatrix = Matrix.PerspectiveFovLH((float)Math.PI / 2.0f, 1.0f, 0.05f, range); ContextHelper.SetDepthStencilState(context, ContextHelper.DepthConfigurationType.DepthCompare); // set the shaders context.VertexShader.Set(ShaderManager.GetVertexShader("VertexScene")); context.PixelShader.Set(depthOnly ? null : ShaderManager.GetPixelShader("PixelSceneSimple")); dynamic cvpb = m_CurrentViewportBuffer; for (int i = 0; i < 6; ++i) { Vector3 lookAt = new Vector3(); Vector3 upVec = new Vector3(); switch (i) { case 0: lookAt = new Vector3(1.0f, 0.0f, 0.0f); upVec = new Vector3(0.0f, 1.0f, 0.0f); break; case 1: lookAt = new Vector3(-1.0f, 0.0f, 0.0f); upVec = new Vector3(0.0f, 1.0f, 0.0f); break; case 2: lookAt = new Vector3(0.0f, 1.0f, 0.0f); upVec = new Vector3(0.0f, 0.0f, -1.0f); break; case 3: lookAt = new Vector3(0.0f, -1.0f, 0.0f); upVec = new Vector3(0.0f, 0.0f, 1.0f); break; case 4: lookAt = new Vector3(0.0f, 0.0f, 1.0f); upVec = new Vector3(0.0f, 1.0f, 0.0f); break; case 5: lookAt = new Vector3(0.0f, 0.0f, -1.0f); upVec = new Vector3(0.0f, 1.0f, 0.0f); break; } Matrix viewMatrix = Matrix.LookAtLH(position, position + lookAt, upVec); cvpb.g_ProjMatrix = projectionMatrix; cvpb.g_ViewMatrix = viewMatrix; cvpb.g_ViewProjMatrix = viewMatrix * projectionMatrix; { context.ClearRenderTargetView(targetTexture.m_ArrayRenderTargetViews[i], clearColor); context.ClearDepthStencilView(targetDepth.m_ArrayDepthStencilViews[i], DepthStencilClearFlags.Depth, 1.0f, 0); RenderTargetSet.BindTextureAsRenderTarget(context, targetTexture.m_ArrayRenderTargetViews[i], targetDepth.m_ArrayDepthStencilViews[i], targetTexture.m_Width, targetTexture.m_Height); m_CurrentViewportBuffer.CompileAndBind(context); // render triangles sceneWrapper.Render(context); RenderTargetSet.BindNull(context); } } ContextHelper.SetDepthStencilState(context, ContextHelper.DepthConfigurationType.NoDepth); } }
private static void UpdateGlobalConstantBuffer(DeviceContext context, CustomConstantBufferInstance globalFrameConstantBuffer, CSharpRendererMainForm form) { dynamic gfcb = globalFrameConstantBuffer; Random rand = new Random(); gfcb.g_Time = (float)m_Time; if (!form.GetFreezeTime()) gfcb.g_FrameRandoms = new Vector4((float)rand.NextDouble(), (float)rand.NextDouble(), (float)rand.NextDouble(), (float)rand.NextDouble()); gfcb.g_FrameNumber = m_FrameNumber; gfcb.g_GPUDebugOn = DebugManager.m_GPUDebugOn ? 1.0f : 0.0f; gfcb.g_GPUDebugOverridePositionEnable = form.GetGPUDebuggingOverridePos() ? 1.0f : 0.0f; gfcb.g_GPUDebugOverridePositionXYZ = new Vector4((float)form.GetGPUDebuggingOverridePosX(), (float)form.GetGPUDebuggingOverridePosY(), (float)form.GetGPUDebuggingOverridePosZ(), 0.0f); globalFrameConstantBuffer.CompileAndBind(context); }
private void CalculateAndUpdateConstantBuffer(DeviceContext context, double tick) { Matrix previousFrameViewProjMatrix = m_ViewportCamera.m_ViewProjectionMatrix; m_ViewportCamera.TickCamera(tick); dynamic mcb = m_ForwardPassBuffer; dynamic vcb = m_ViewportConstantBuffer; dynamic ppcb = m_PostEffectsConstantBuffer; dynamic cvpb = m_CurrentViewportBuffer; m_ViewportCamera.CalculateMatrices(); m_ShadowCamera.CalculateMatrices(); // Temporal component of matrix Matrix temporalJitter = Matrix.Identity; if (vcb.g_TemporalAA > 0.5f) { //float translationOffset = (TemporalSurfaceManager.GetCurrentPhase("ResolvedColor") == 0) ? 0.5f : -0.5f; //float translationOffsetX = translationOffset; //float translationOffsetY = translationOffset; temporalJitter = Matrix.Translation((POISSON_SAMPLES[(Program.m_FrameNumber) % POISSON_SAMPLE_NUM * 2 + 0] * 2.0f - 1.0f) / (float)m_ResolutionX, (POISSON_SAMPLES[(Program.m_FrameNumber) % POISSON_SAMPLE_NUM * 2 + 1] * 2.0f - 1.0f) / (float)m_ResolutionY, 0.0f); } m_ScatterDOFPass.m_DebugBokeh = ppcb.g_DebugBokeh > 0.5f; Vector3 sceneMin, sceneMax; m_SimpleSceneWrapper.GetSceneBounds(out sceneMin, out sceneMax); vcb.g_ViewProjMatrixPrevFrame = previousFrameViewProjMatrix; cvpb.g_ProjMatrix = m_ViewportCamera.m_ProjectionMatrix; cvpb.g_ViewMatrix = m_ViewportCamera.m_WorldToView; cvpb.g_InvViewProjMatrix = m_ViewportCamera.m_ViewProjectionMatrix; cvpb.g_InvViewProjMatrix.Invert(); cvpb.g_ViewProjMatrix = m_ViewportCamera.m_ViewProjectionMatrix * temporalJitter; Matrix viewToWorldMatrix = m_ViewportCamera.m_WorldToView; viewToWorldMatrix.Invert(); float projWidth = m_ViewportCamera.m_ProjectionMatrix.M11; float projHeight = m_ViewportCamera.m_ProjectionMatrix.M22; vcb.g_EyeXAxis = Vector4.Transform(new Vector4(1.0f / projWidth, 0, 0, 0), viewToWorldMatrix); vcb.g_EyeYAxis = Vector4.Transform(new Vector4(0, 1.0f / projHeight, 0, 0), viewToWorldMatrix); vcb.g_EyeZAxis = Vector4.Transform(new Vector4(0, 0, 1, 0), viewToWorldMatrix); vcb.g_WorldEyePos = new Vector4(m_ViewportCamera.m_CameraPosition, 1.0f); vcb.g_WorldBoundsMin = new Vector4(sceneMin, 0.0f); vcb.g_WorldBoundsMax = new Vector4(sceneMax, 0.0f); Vector3 invRange = new Vector3(1.0f / (sceneMax.X - sceneMin.X), 1.0f / (sceneMax.Y - sceneMin.Y), 1.0f / (sceneMax.Z - sceneMin.Z)); vcb.g_WorldBoundsInvRange = new Vector4(invRange, 0.0f); vcb.g_zNear = m_ViewportCamera.m_NearZ; vcb.g_zFar = m_ViewportCamera.m_FarZ; vcb.g_FrameJitter = (TemporalSurfaceManager.GetCurrentPhase("ResolvedColor") == 0) ? 1.0f : 0.0f; vcb.g_ScreenSize = new Vector4((float)m_ResolutionX, (float)m_ResolutionY, 1.0f / (float)m_ResolutionX, 1.0f / (float)m_ResolutionY); vcb.g_ScreenSizeHalfRes = new Vector4((float)m_ResolutionX / 2.0f, (float)m_ResolutionY / 2.0f, 2.0f / (float)m_ResolutionX, 2.0f / (float)m_ResolutionY); vcb.g_ReprojectInfo = new Vector4( -2.0f / ((float)m_ResolutionX * m_ViewportCamera.m_ProjectionMatrix.M11), -2.0f / ((float)m_ResolutionY * m_ViewportCamera.m_ProjectionMatrix.M22), (1.0f - m_ViewportCamera.m_ProjectionMatrix.M13) / m_ViewportCamera.m_ProjectionMatrix.M11, (1.0f + m_ViewportCamera.m_ProjectionMatrix.M23) / m_ViewportCamera.m_ProjectionMatrix.M22); vcb.g_ReprojectInfoFromInt = vcb.g_ReprojectInfo + new Vector4(0.0f, 0.0f, vcb.g_ReprojectInfo.X * 0.5f, vcb.g_ReprojectInfo.Y * 0.5f); mcb.g_ShadowViewProjMatrix = m_ShadowCamera.m_ViewProjectionMatrix; mcb.g_ShadowInvViewProjMatrix = m_ShadowCamera.m_ViewProjectionMatrix; mcb.g_ShadowInvViewProjMatrix.Invert(); mcb.g_LightDir = new Vector4(-m_ShadowCamera.m_CameraForward, 1.0f); mcb.g_LightColor = new Vector4(1.0f, 0.95f, 0.9f, 0.0f); float time = (float)Program.m_Time; mcb.g_LocalPointLightPosition = new Vector4((float)Math.Sin(0.05f * time) * 10.0f, 2.0f, (float)Math.Cos(time * 0.15f) * 5.8f, 0.0f); mcb.g_LocalPointLightColor = new Vector4(1, 0, 0, 0); m_ViewportConstantBuffer.CompileAndBind(context); m_ForwardPassBuffer.CompileAndBind(context); m_CurrentViewportBuffer.CompileAndBind(context); m_PostEffectsConstantBuffer.CompileAndBind(context); }
public void ExecutePass(DeviceContext context, RenderTargetSet target, RenderTargetSet linearDepth, RenderTargetSet motionVectors, RenderTargetSet surfaceNormals, DepthOperationsPass depthOps) { RenderTargetSet ssaoCurrent = TemporalSurfaceManager.GetRenderTargetCurrent("SSAO"); RenderTargetSet ssaoHistory = TemporalSurfaceManager.GetRenderTargetHistory("SSAO"); if (DebugManager.IsFeatureOn("SSAO")) { RenderTargetSet tempBlurBuffer = RenderTargetManager.RequestRenderTargetFromPool(m_RTDescriptor); Random rand = new Random(); dynamic scb = m_SSAOBuffer; scb.g_SSAOPhase = (float)rand.NextDouble() * 3.1415f; m_SSAOBuffer.CompileAndBind(context); using (new GpuProfilePoint(context, "SSAO")) { using (new GpuProfilePoint(context, "SSAOCalculate")) { linearDepth.BindSRV(context, 0); ssaoHistory.BindSRV(context, 1); motionVectors.BindSRV(context, 2); surfaceNormals.BindSRV(context, 3); ssaoCurrent.BindAsRenderTarget(context); PostEffectHelper.RenderFullscreenTriangle(context, "SSAOCalculate"); RenderTargetSet.BindNull(context); ContextHelper.ClearSRVs(context); } DebugManager.RegisterDebug(context, "SSAOMain", ssaoCurrent); using (new GpuProfilePoint(context, "SSAOBlur")) { ssaoCurrent.BindSRV(context, 1); tempBlurBuffer.BindAsRenderTarget(context); PostEffectHelper.RenderFullscreenTriangle(context, "SSAOBlurHorizontal"); RenderTargetSet.BindNull(context); ContextHelper.ClearSRVs(context); DebugManager.RegisterDebug(context, "SSAOBlurH", tempBlurBuffer); tempBlurBuffer.BindSRV(context, 1); target.BindAsRenderTarget(context); PostEffectHelper.RenderFullscreenTriangle(context, "SSAOBlurVertical"); RenderTargetSet.BindNull(context); ContextHelper.ClearSRVs(context); DebugManager.RegisterDebug(context, "SSAOBlurV", target); } } RenderTargetManager.ReleaseRenderTargetToPool(tempBlurBuffer); } else { target.Clear(context, new SlimDX.Color4(1.0f, 1.0f, 1.0f, 1.0f)); } if (DebugManager.IsDebugging("UpsampledSSAO")) { RenderTargetSet tempFullResBuffer = RenderTargetManager.RequestRenderTargetFromPool(m_UpsampleDebugRTDescriptor); target.BindSRV(context, 0); depthOps.m_BilateralUpsampleOffsets.BindSRV(context, 10); tempFullResBuffer.BindAsRenderTarget(context); PostEffectHelper.RenderFullscreenTriangle(context, "BilateralUpsample"); RenderTargetSet.BindNull(context); ContextHelper.ClearSRVs(context); DebugManager.RegisterDebug(context, "UpsampledSSAO", tempFullResBuffer); RenderTargetManager.ReleaseRenderTargetToPool(tempFullResBuffer); } }
private void CalculateAndUpdateConstantBuffer(DeviceContext context) { Matrix previousFrameViewProjMatrix = m_ViewportCamera.m_ViewProjectionMatrix; m_ViewportCamera.TickCamera(0.1f); dynamic mcb = m_ForwardPassBuffer; dynamic vcb = m_ViewportConstantBuffer; dynamic ppcb = m_PostEffectsConstantBuffer; dynamic cvpb = m_CurrentViewportBuffer; m_ViewportCamera.CalculateMatrices(); m_ShadowCamera.CalculateMatrices(); // Temporal component of matrix Matrix temporalJitter = Matrix.Identity; if (vcb.temporalAA > 0.5f) { System.Random rand = new System.Random(); float translationOffset = (TemporalSurfaceManager.GetCurrentPhase("ResolvedColor") == 0) ? 0.5f : -0.5f; float translationOffsetX = translationOffset; float translationOffsetY = translationOffset; temporalJitter = Matrix.Translation(translationOffsetX / (float)m_ResolutionX, translationOffsetY / (float)m_ResolutionY, 0.0f); } m_ScatterDOFPass.m_DebugBokeh = ppcb.debugBokeh > 0.5f; Vector3 sceneMin, sceneMax; m_SimpleSceneWrapper.GetSceneBounds(out sceneMin, out sceneMax); vcb.viewProjMatrixPrevFrame = previousFrameViewProjMatrix; cvpb.projMatrix = m_ViewportCamera.m_ProjectionMatrix; cvpb.viewMatrix = m_ViewportCamera.m_WorldToView; cvpb.invViewProjMatrix = m_ViewportCamera.m_ViewProjectionMatrix; cvpb.invViewProjMatrix.Invert(); cvpb.viewProjMatrix = m_ViewportCamera.m_ViewProjectionMatrix * temporalJitter; vcb.worldEyePos = new Vector4(m_ViewportCamera.m_CameraPosition, 1.0f); vcb.worldBoundsMin = new Vector4(sceneMin, 0.0f); vcb.worldBoundsMax = new Vector4(sceneMax, 0.0f); Vector3 invRange = new Vector3(1.0f / (sceneMax.X - sceneMin.X), 1.0f / (sceneMax.Y - sceneMin.Y), 1.0f / (sceneMax.Z - sceneMin.Z)); vcb.worldBoundsInvRange = new Vector4(invRange, 0.0f); vcb.zNear = m_ViewportCamera.m_NearZ; vcb.zFar = m_ViewportCamera.m_FarZ; vcb.screenSize = new Vector4((float)m_ResolutionX, (float)m_ResolutionY, 1.0f / (float)m_ResolutionX, 1.0f / (float)m_ResolutionY); vcb.screenSizeHalfRes = new Vector4((float)m_ResolutionX / 2.0f, (float)m_ResolutionY / 2.0f, 2.0f / (float)m_ResolutionX, 2.0f / (float)m_ResolutionY); vcb.reprojectInfo = new Vector4( -2.0f / ((float)m_ResolutionX * m_ViewportCamera.m_ProjectionMatrix.M11), -2.0f / ((float)m_ResolutionY * m_ViewportCamera.m_ProjectionMatrix.M22), (1.0f - m_ViewportCamera.m_ProjectionMatrix.M13) / m_ViewportCamera.m_ProjectionMatrix.M11, (1.0f + m_ViewportCamera.m_ProjectionMatrix.M23) / m_ViewportCamera.m_ProjectionMatrix.M22); vcb.reprojectInfoFromInt = vcb.reprojectInfo + new Vector4(0.0f, 0.0f, vcb.reprojectInfo.X * 0.5f, vcb.reprojectInfo.Y * 0.5f); mcb.shadowViewProjMatrix = m_ShadowCamera.m_ViewProjectionMatrix; mcb.shadowInvViewProjMatrix = m_ShadowCamera.m_ViewProjectionMatrix; mcb.shadowInvViewProjMatrix.Invert(); mcb.lightDir = new Vector4(-m_ShadowCamera.m_CameraForward, 1.0f); m_ViewportConstantBuffer.CompileAndBind(context); m_ForwardPassBuffer.CompileAndBind(context); m_CurrentViewportBuffer.CompileAndBind(context); m_PostEffectsConstantBuffer.CompileAndBind(context); }