private void drawCombinedHdrImage(RenderTargetView output, GBuffer buffer, CombineFinalRenderer finalRenderer, ShaderResourceView background, ShaderResourceView ssao) { game.Device.ImmediateContext.ClearState(); game.SetBackbuffer(); // This is to set default viewport only, because i am lazy context.OutputMerger.SetTargets(output); finalRenderer.DrawCombined(ssao); // Clear background to certain color context.OutputMerger.SetTargets(buffer.DepthStencilView, output); context.OutputMerger.DepthStencilState = backgroundDepthStencilState; game.TextureRenderer.Draw(background, new Vector2(), new Vector2(screenWidth, screenHeight)); }
public SimpleLightedScene(DX11Game game, GBuffer buffer) { this.game = game; this.buffer = buffer; ctx = game.Device.ImmediateContext; // Non-related init code point = new PointLightRenderer(game, buffer); point.LightRadius = 3; point.LightIntensity = 1; point.ShadowsEnabled = false; angle = 0; combineFinal = new CombineFinalRenderer(game, buffer); }
public TestCombineFinalClass(DX11Game game) { this.game = game; var device = game.Device; context = device.ImmediateContext; FilledGBuffer = new TestFilledGBuffer(game, 800, 600); spot = new SpotLightRenderer(game, FilledGBuffer.GBuffer); point = new PointLightRenderer(game, FilledGBuffer.GBuffer); directional = new DirectionalLightRenderer(game, FilledGBuffer.GBuffer); state = 0; combineFinal = new CombineFinalRenderer(game, FilledGBuffer.GBuffer); var desc = new Texture2DDescription { BindFlags = BindFlags.RenderTarget | BindFlags.ShaderResource, Format = Format.R16G16B16A16_Float, Width = FilledGBuffer.GBuffer.Width, Height = FilledGBuffer.GBuffer.Height, ArraySize = 1, SampleDescription = new SampleDescription(1, 0), MipLevels = 1 }; hdrImage = new Texture2D(device, desc); hdrImageRTV = new RenderTargetView(device, hdrImage); hdrImageRV = new ShaderResourceView(device, hdrImage); }
public void TestCullerObjects() { var game = new DX11Game(); game.InitDirectX(); Vector3 radius = new Vector3(100, 1000, 100); FrustumCuller culler = new FrustumCuller(new BoundingBox(-radius, radius), 6); var mesh = RenderingTestsHelper.CreateSimpleTestMesh(); var texturePool = new TexturePool(game); var gBuffer = new GBuffer(game.Device, 800, 600); var renderer = new DeferredMeshesRenderer(game, gBuffer, texturePool); var final = new CombineFinalRenderer(game, gBuffer); DeferredMeshElement middle = null; for (int i = 0; i < 50; i++) { for (int j = 0; j < 50; j++) { var el = renderer.AddMesh(mesh); el.WorldMatrix = Matrix.Translation(MathHelper.Right * i * 2 + Vector3.UnitZ * j * 2); if (i > 20 && i < 30 && j > 20 && j < 30) { el.Delete(); } else { culler.AddCullable(el); } } } QuadTreeVisualizer visualizer = new QuadTreeVisualizer(); List <TestCullObject> cullObjects = new List <TestCullObject>(); SpectaterCamera cullCam = new SpectaterCamera(10f, 80); cullCam.Positie = new Vector3(8, 10, 8); cullCam.EnableUserInput = false; bool rotate = true; int selectedNode = -1; var view = culler.CreateView(); game.GameLoopEvent += delegate { view.UpdateVisibility(cullCam.ViewProjection); var visibleCullables = view.GetVisibleCullables(); if (rotate) { cullCam.AngleHorizontal += game.Elapsed * MathHelper.Pi * (1 / 8f); } if (game.Keyboard.IsKeyPressed(Key.NumberPadPlus)) { selectedNode++; } if (game.Keyboard.IsKeyPressed(Key.NumberPadMinus)) { selectedNode--; } if (game.Keyboard.IsKeyPressed(Key.Return)) { int count = -1; visualizer.RenderNodeGroundBoundig(game, culler.RootNode, delegate(FrustumCuller.CullNode node, out Color4 col) { col = Color.Red.dx(); count++; if (count == selectedNode) { node.Tag = "SELECTED!"; } return(count == selectedNode); }); } if (game.Keyboard.IsKeyPressed(Key.NumberPad0)) { rotate = !rotate; } gBuffer.Clear(); gBuffer.SetTargetsToOutputMerger(); renderer.Draw(); game.Device.ImmediateContext.ClearState(); game.SetBackbuffer(); final.DrawCombined(); game.LineManager3D.AddViewFrustum(new BoundingFrustum(cullCam.ViewProjection), Color.White.dx()); for (int i = 0; i < visibleCullables.Count; i++) { game.LineManager3D.AddBox(visibleCullables[i].BoundingBox, Color.Red.dx()); } visualizer.RenderNodeGroundBoundig(game, culler.RootNode, delegate(FrustumCuller.CullNode node, out Color4 col) { col = Color.Green.dx(); return(!view.IsNodeVisible(node)); }); visualizer.RenderNodeGroundBoundig(game, culler.RootNode, delegate(FrustumCuller.CullNode node, out Color4 col) { col = Color.Orange.dx(); return(view.IsNodeVisible(node)); }); cullCam.Update(game.Elapsed, game.Keyboard, game.Mouse); /*int count = -1; * visualizer.RenderNodeGroundBoundig(game, culler.RootNode, * delegate(Culler.CullNode node, out Color col) * { * col = Color.Red; * count++; * return count == selectedNode; * });*/ }; game.Run(); }
private void drawLights(CombineFinalRenderer finalRenderer) { finalRenderer.ClearLightAccumulation(); // Possibly do all shadowmap up front, even cache some shadow maps. for (int i = 0; i < directionalLights.Count; i++) { var l = directionalLights[i]; var r = directionalLightRenderer; setDirectionalLightToRenderer(r, l); if (l.ShadowsEnabled) { updateDirectionalShadows(r, l.ShadowViews); } finalRenderer.SetLightAccumulationStates(); r.Draw(); } pointLightRenderer.NextShadowUpdate--; for (int i = 0; i < pointLights.Count; i++) { var l = pointLights[i]; var r = pointLightRenderer; setPointLightToRenderer(r, l); if (pointLightRenderer.NextShadowUpdate <= 0) { if (l.ShadowsEnabled) { updatePointShadows(r, l.Views); } } finalRenderer.SetLightAccumulationStates(); r.Draw(); } if (pointLightRenderer.NextShadowUpdate <= 0) { pointLightRenderer.NextShadowUpdate = pointLightRenderer.ShadowUpdateInterval; } for (int i = 0; i < spotLights.Count; i++) { var l = spotLights[i]; var r = spotLightRenderer; setSpotLightToRenderer(r, l); if (l.ShadowsEnabled) { updateSpotShadows(r, l.ShadowView); } finalRenderer.SetLightAccumulationStates(); r.Draw(); } }
public DeferredRenderer(DX11Game game) { this.game = game; var device = game.Device; context = device.ImmediateContext; screenWidth = game.Form.Form.ClientSize.Width; screenHeight = game.Form.Form.ClientSize.Height; int width = screenWidth; int height = screenHeight; gBuffer = new GBuffer(game.Device, width, height); texturePool = new TexturePool(game); meshesRenderer = new DeferredMeshesRenderer(game, gBuffer, TexturePool); directionalLightRenderer = new DirectionalLightRenderer(game, GBuffer); spotLightRenderer = new SpotLightRenderer(game, GBuffer); pointLightRenderer = new PointLightRenderer(game, GBuffer); combineFinalRenderer = new CombineFinalRenderer(game, GBuffer); var desc = new Texture2DDescription { BindFlags = BindFlags.RenderTarget | BindFlags.ShaderResource, Format = Format.R16G16B16A16_Float, Width = screenWidth, Height = screenHeight, ArraySize = 1, SampleDescription = new SampleDescription(1, 0), MipLevels = 1 }; hdrImage = new Texture2D(device, desc); hdrImageRtv = new RenderTargetView(device, hdrImage); hdrImageRV = new ShaderResourceView(device, hdrImage); calculater = new AverageLuminanceCalculater(game, hdrImageRV); toneMap = new ToneMapRenderer(game); var tempDesc = new Texture2DDescription { ArraySize = 1, BindFlags = BindFlags.None, CpuAccessFlags = CpuAccessFlags.Read, Format = Format.R32_Float, Height = 1, MipLevels = 1, OptionFlags = ResourceOptionFlags.None, SampleDescription = new SampleDescription(1, 0), Usage = ResourceUsage.Staging, Width = 1 }; tempTex = new Texture2D(device, tempDesc); ssao = new HorizonSSAORenderer(game, screenWidth, screenHeight); Vector3 radius = new Vector3(500, 1000, 500); frustumCuller = new FrustumCuller(new BoundingBox(-radius, radius), 1); gbufferView = frustumCuller.CreateView(); meshesRenderer.Culler = frustumCuller; Texture2D skyColorTexture;// = Texture2D.FromFile(game.Device, TWDir.GameData.CreateSubdirectory("Core") + "\\skyColor.bmp"); var strm = new DataStream(16 * 4, true, true); var multiplier = 2; strm.Write(new Half4(new Half(135f / 255f * multiplier), new Half(206f / 255f * multiplier), new Half(235 / 255f * multiplier), new Half(1))); strm.Position = 0; var dataRectangle = new DataRectangle(16 * 4, strm); skyColorTexture = new Texture2D(game.Device, new Texture2DDescription { ArraySize = 1, BindFlags = BindFlags.ShaderResource, CpuAccessFlags = CpuAccessFlags.None, Format = Format.R16G16B16A16_Float, Height = 1, MipLevels = 1, OptionFlags = ResourceOptionFlags.None, SampleDescription = new SampleDescription(1, 0), Usage = ResourceUsage.Default, Width = 1 }, dataRectangle); skyColorRV = new ShaderResourceView(game.Device, skyColorTexture); postProcessRT1 = CreateBackbufferLikeRT(); postProcessRT2 = CreateBackbufferLikeRT(); fogRenderer = new FogEffect(game); backgroundDepthStencilState = DepthStencilState.FromDescription(game.Device, new DepthStencilStateDescription() { IsDepthEnabled = true, DepthComparison = Comparison.LessEqual, DepthWriteMask = DepthWriteMask.Zero, }); lineManager = new LineManager3D(game.Device); updateRasterizerState(); }
public void drawMeshTest(IMesh mesh, Matrix worldMatrix) { var game = createGame(); var pool = createTexturePool(game); var worldMesh = new WorldMesh { Mesh = mesh, WorldMatrix = worldMatrix }; var meshes = new MeshesRenderer(new RendererResourcePool(new MeshRenderDataFactory(game, null, pool), pool, game), game); var ctx = game.Device.ImmediateContext; var gBuffer = createGBuffer(game); var scene = new RenderingTestsHelper.SimpleLightedScene(game, gBuffer); var list = new List <WorldMesh>(); list.Add(worldMesh); var buffer = gBuffer; ctx = game.Device.ImmediateContext; // Non-related init code var point = new PointLightRenderer(game, buffer); point.LightRadius = 3; point.LightIntensity = 1; point.ShadowsEnabled = false; var angle = 0f; var combineFinal = new CombineFinalRenderer(game, buffer); var raster = new RasterizerStateDescription() { CullMode = CullMode.Front, FillMode = FillMode.Solid }; var state = RasterizerState.FromDescription(game.Device, raster); point.LightRadius = 10; game.GameLoopEvent += delegate { ctx.ClearState(); ctx.Rasterizer.State = state; gBuffer.Clear(); gBuffer.SetTargetsToOutputMerger(); meshes.DrawMeshes(list, game.Camera); angle += MathHelper.Pi * game.Elapsed; var alpha = 0.99f * game.Elapsed * 20000; var cam = game.Camera.ViewInverse.GetTranslation(); var diff = cam - point.LightPosition; diff.Normalize(); point.LightPosition += diff * game.Elapsed * 2;// new Vector3((float)Math.Sin(angle), (float)Math.Cos(angle), -2); ctx.ClearState(); combineFinal.SetLightAccumulationStates(); combineFinal.ClearLightAccumulation(); point.Draw(); ctx.ClearState(); game.SetBackbuffer(); ctx.Rasterizer.SetViewports(new Viewport(400, 300, 400, 300)); combineFinal.DrawCombined(); game.SetBackbuffer(); GBufferTest.DrawGBuffer(game, buffer); }; game.Run(); }