public override void DrawScene() { ImmediateContext.ClearRenderTargetView(RenderTargetView, Color.Silver); ImmediateContext.ClearDepthStencilView(DepthStencilView, DepthStencilClearFlags.Depth | DepthStencilClearFlags.Stencil, 1.0f, 0); if (Util.IsKeyDown(Keys.W)) { ImmediateContext.Rasterizer.State = RenderStates.WireframeRS; } _terrain.Renderer.Draw(ImmediateContext, _camera, _dirLights); ImmediateContext.Rasterizer.State = null; _sky.Draw(ImmediateContext, _camera); ImmediateContext.Rasterizer.State = null; ImmediateContext.OutputMerger.DepthStencilState = null; ImmediateContext.OutputMerger.DepthStencilReference = 0; SwapChain.Present(0, PresentFlags.None); }
/// <summary> /// Renders to back buffer. /// </summary> /// <param name="context">The context.</param> /// <param name="parameter">The parameter.</param> public virtual void RenderToBackBuffer(RenderContext context, ref RenderParameter parameter) { if (context.RenderHost.FeatureLevel >= global::SharpDX.Direct3D.FeatureLevel.Level_11_0 && context.RenderHost.RenderConfiguration.FXAALevel != FXAALevel.None) { postFXAACore.FXAALevel = context.RenderHost.RenderConfiguration.FXAALevel; postFXAACore.Render(context, ImmediateContext); } ImmediateContext.Flush(); var buffer = context.RenderHost.RenderBuffer; if (parameter.IsMSAATexture) { ImmediateContext.ResolveSubresource(parameter.CurrentTargetTexture, 0, buffer.BackBuffer.Resource, 0, buffer.Format); } else { ImmediateContext.CopyResource(parameter.CurrentTargetTexture, buffer.BackBuffer.Resource); } }
/// <summary> /// Renders the screen spaced. /// </summary> /// <param name="context">The context.</param> /// <param name="renderables">The renderables.</param> /// <param name="start">Start index in renderables</param> /// <param name="count">Number of renderables to render.</param> /// <param name="parameter">The parameter.</param> public virtual void RenderScreenSpaced(RenderContext context, FastList <SceneNode> renderables, int start, int count, ref RenderParameter parameter) { if (count > 0) { var hasMSAA = context.RenderHost.RenderBuffer.ColorBufferSampleDesc.Count == 1; var buffer = context.RenderHost.RenderBuffer; var depthStencilBuffer = hasMSAA ? buffer.DepthStencilBuffer : context.GetOffScreenDS(OffScreenTextureSize.Full, Format.D32_Float_S8X24_UInt); ImmediateContext.SetRenderTargets(depthStencilBuffer, parameter.RenderTargetView); for (var i = start; i < start + count; ++i) { renderables[i].Render(context, ImmediateContext); } if (!hasMSAA) { depthStencilBuffer.Dispose(); } } }
public override void DrawScene() { ImmediateContext.ClearRenderTargetView(RenderTargetView, Color.Silver); ImmediateContext.ClearDepthStencilView(DepthStencilView, DepthStencilClearFlags.Depth | DepthStencilClearFlags.Stencil, 1.0f, 0); var view = _camera.View; var proj = _camera.Proj; Effects.NormalMapFX.SetDirLights(_dirLights); Effects.NormalMapFX.SetEyePosW(_camera.Position); var floorTech = Effects.NormalMapFX.Light3TexTech; var activeTech = Effects.NormalMapFX.Light3Tech; ImmediateContext.InputAssembler.InputLayout = InputLayouts.PosNormalTexTan; ImmediateContext.InputAssembler.PrimitiveTopology = PrimitiveTopology.TriangleList; if (Util.IsKeyDown(Keys.W)) { ImmediateContext.Rasterizer.State = RenderStates.WireframeRS; } for (var p = 0; p < floorTech.Description.PassCount; p++) { var pass = activeTech.GetPassByIndex(p); _grid.Draw(ImmediateContext, pass, view, proj); } for (var p = 0; p < activeTech.Description.PassCount; p++) { var pass = activeTech.GetPassByIndex(p); foreach (var ammoRound in _ammo) { ammoRound.Render(ImmediateContext, pass, view, proj); } _cylinder.Draw(ImmediateContext, pass, view, proj); } SwapChain.Present(0, PresentFlags.None); ImmediateContext.Rasterizer.State = null; }
/// <summary> /// Renders the scene. /// </summary> /// <param name="context">The context.</param> /// <param name="renderables">The renderables.</param> /// <param name="parameter">The parameter.</param> /// <param name="testFrustum"></param> /// <returns>Number of node has been rendered</returns> public override int RenderOpaque(RenderContext context, FastList <SceneNode> renderables, ref RenderParameter parameter, bool testFrustum) { if (scheduler.ScheduleAndRun(renderables, deferredContextPool, context, parameter, testFrustum, commandList, out var counter)) { var param = parameter; foreach (var command in commandList.OrderBy(x => x.Key)) { ImmediateContext.ExecuteCommandList(command.Value, true); command.Value.Dispose(); } commandList.Clear(); return(counter); } else { return(base.RenderOpaque(context, renderables, ref parameter, testFrustum)); } }
protected override void Dispose(bool disposing) { if (!_disposed) { if (disposing) { ImmediateContext.ClearState(); Util.ReleaseCom(ref _sky); Util.ReleaseCom(ref _terrain); Util.ReleaseCom(ref _treeModel); Util.ReleaseCom(ref _instanceBuffer); Effects.DestroyAll(); InputLayouts.DestroyAll(); RenderStates.DestroyAll(); Util.ReleaseCom(ref _txMgr); } _disposed = true; } base.Dispose(disposing); }
public override void DrawScene() { base.DrawScene(); ImmediateContext.ClearRenderTargetView(RenderTargetView, Color.Silver); ImmediateContext.ClearDepthStencilView( DepthStencilView, DepthStencilClearFlags.Depth | DepthStencilClearFlags.Stencil, 1.0f, 0); ImmediateContext.InputAssembler.InputLayout = InputLayouts.PosNormalTexTan; ImmediateContext.InputAssembler.PrimitiveTopology = PrimitiveTopology.TriangleList; _camera.UpdateViewMatrix(); var viewProj = _camera.ViewProj; var view = _camera.View; var proj = _camera.Proj; Effects.NormalMapFX.SetDirLights(_dirLights); Effects.NormalMapFX.SetEyePosW(_camera.Position); var activeTech = Effects.NormalMapFX.Light3TexTech; for (var p = 0; p < activeTech.Description.PassCount; p++) { var pass = activeTech.GetPassByIndex(p); _modelInstance.Draw(ImmediateContext, pass, view, proj); _stoneInstance.Draw(ImmediateContext, pass, view, proj); _dwarfInstance.Draw(ImmediateContext, pass, view, proj); //_towerInstance.Draw(ImmediateContext, pass, view, proj); } Effects.BasicFX.SetDirLights(_dirLights); Effects.BasicFX.SetEyePosW(_camera.Position); activeTech = Effects.BasicFX.Light3Tech; for (var p = 0; p < activeTech.Description.PassCount; p++) { var pass = activeTech.GetPassByIndex(p); _towerInstance.Draw(ImmediateContext, pass, view, proj, RenderMode.Basic); } SwapChain.Present(0, PresentFlags.None); }
public override void DrawScene() { base.DrawScene(); ImmediateContext.ClearRenderTargetView(RenderTargetView, Color.LightSteelBlue); ImmediateContext.ClearDepthStencilView(DepthStencilView, DepthStencilClearFlags.Depth | DepthStencilClearFlags.Stencil, 1.0f, 0); ImmediateContext.InputAssembler.InputLayout = _inputLayout; ImmediateContext.InputAssembler.PrimitiveTopology = PrimitiveTopology.TriangleList; ImmediateContext.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(_vb, VertexPC.Stride, 0)); ImmediateContext.InputAssembler.SetIndexBuffer(_ib, Format.R32_UInt, 0); var wvp = _world * _view * _proj; _fxWVP.SetMatrix(wvp); for (int p = 0; p < _tech.Description.PassCount; p++) { _tech.GetPassByIndex(p).Apply(ImmediateContext); ImmediateContext.DrawIndexed(_gridIndexCount, 0, 0); } SwapChain.Present(0, PresentFlags.None); }
/// <summary> /// Renders the screen spaced. /// </summary> /// <param name="context">The context.</param> /// <param name="renderables">The renderables.</param> /// <param name="parameter">The parameter.</param> public virtual void RenderScreenSpaced(RenderContext context, FastList <SceneNode> renderables, ref RenderParameter parameter) { int count = renderables.Count; if (count > 0) { var buffer = context.RenderHost.RenderBuffer; bool useDefault = parameter.RenderTargetView[0] == buffer.ColorBuffer.RenderTargetView; var depthStencilBuffer = useDefault ? buffer.DepthStencilBuffer : context.GetOffScreenDS(OffScreenTextureSize.Full, Format.D32_Float_S8X24_UInt); ImmediateContext.SetRenderTargets(depthStencilBuffer, parameter.RenderTargetView); for (int i = 0; i < count; ++i) { renderables[i].Render(context, ImmediateContext); } if (!useDefault) { depthStencilBuffer.Dispose(); } } }
/// <summary> /// Renders the screen spaced. /// </summary> /// <param name="context">The context.</param> /// <param name="renderables">The renderables.</param> /// <param name="parameter">The parameter.</param> public virtual void RenderScreenSpaced(RenderContext context, List <SceneNode> renderables, ref RenderParameter parameter) { int count = renderables.Count; if (count > 0) { var buffer = context.RenderHost.RenderBuffer; bool useDefault = parameter.RenderTargetView[0] == buffer.ColorBuffer.RenderTargetView; var depthStencilBuffer = useDefault ? buffer.DepthStencilBuffer : buffer.FullResDepthStencilPool.Get(Format.D32_Float_S8X24_UInt); ImmediateContext.SetRenderTargets(depthStencilBuffer, parameter.RenderTargetView); for (int i = 0; i < count; ++i) { renderables[i].RenderCore.Render(context, ImmediateContext); } if (!useDefault) { buffer.FullResDepthStencilPool.Put(Format.D32_Float_S8X24_UInt, depthStencilBuffer); } } }
protected override void Dispose(bool disposing) { if (!_disposed) { if (disposing) { ImmediateContext.ClearState(); Util.ReleaseCom(ref _roomVB); Util.ReleaseCom(ref _skullVB); Util.ReleaseCom(ref _skullIB); Util.ReleaseCom(ref _floorDiffuseMapSRV); Util.ReleaseCom(ref _wallDiffuseMapSRV); Util.ReleaseCom(ref _mirrorDiffuseMapSRV); Effects.DestroyAll(); InputLayouts.DestroyAll(); RenderStates.DestroyAll(); } _disposed = true; } base.Dispose(disposing); }
public override void DrawScene() { base.DrawScene(); ImmediateContext.ClearRenderTargetView(RenderTargetView, Color.DarkGray); ImmediateContext.ClearDepthStencilView(DepthStencilView, DepthStencilClearFlags.Depth | DepthStencilClearFlags.Stencil, 1.0f, 0); ImmediateContext.InputAssembler.InputLayout = _inputLayout; ImmediateContext.InputAssembler.PrimitiveTopology = PrimitiveTopology.TriangleList; var wvp = _world * _view * _proj; _fxWVP.SetMatrix(wvp); // Lighting var array = Util.GetArray(_ambientLight); _fxAmbientLight.SetRawValue( new DataStream(array, false, false), Marshal.SizeOf(_ambientLight) ); array = Util.GetArray(_spotLight); _fxSpotLight.SetRawValue( new DataStream(array, false, false), Marshal.SizeOf(_spotLight) ); _fxEyePosW.Set(_eyePosW); ImmediateContext.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(_cubeVB, VertexPMN.Stride, 0)); ImmediateContext.InputAssembler.SetIndexBuffer(_cubeIB, Format.R32_UInt, 0); for (int p = 0; p < _tech.Description.PassCount; p++) { _tech.GetPassByIndex(p).Apply(ImmediateContext); ImmediateContext.DrawIndexed(36, 0, 0); } SwapChain.Present(0, PresentFlags.None); }
private void DrawScreenQuad() { var stride = Basic32.Stride; const int offset = 0; ImmediateContext.InputAssembler.InputLayout = InputLayouts.Basic32; ImmediateContext.InputAssembler.PrimitiveTopology = PrimitiveTopology.TriangleList; ImmediateContext.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(_screenQuadVB, stride, offset)); ImmediateContext.InputAssembler.SetIndexBuffer(_screenQuadIB, Format.R32_UInt, 0); var world = new Matrix { M11 = 0.5f, M22 = 0.5f, M33 = 1.0f, M41 = 0.5f, M42 = -0.5f, M44 = 1.0f }; var tech = Effects.DebugTexFX.ViewRedTech; for (var p = 0; p < tech.Description.PassCount; p++) { Effects.DebugTexFX.SetWorldViewProj(world); Effects.DebugTexFX.SetTexture(_sMap.DepthMapSRV); tech.GetPassByIndex(p).Apply(ImmediateContext); ImmediateContext.DrawIndexed(6, 0, 0); } }
private void DrawSkull(EffectTechnique activeSkullTech, Matrix viewProj) { // Draw skull for (int p = 0; p < activeSkullTech.Description.PassCount; p++) { var pass = activeSkullTech.GetPassByIndex(p); ImmediateContext.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(_skullVB, Basic32.Stride, 0)); ImmediateContext.InputAssembler.SetIndexBuffer(_skullIB, Format.R32_UInt, 0); var world = _skullWorld; var wit = MathF.InverseTranspose(world); var wvp = world * viewProj; Effects.BasicFX.SetWorld(world); Effects.BasicFX.SetWorldInvTranspose(wit); Effects.BasicFX.SetWorldViewProj(wvp); Effects.BasicFX.SetMaterial(_skullMat); pass.Apply(ImmediateContext); ImmediateContext.DrawIndexed(_skullIndexCount, 0, 0); } }
protected override void Dispose(bool disposing) { if (!_disposed) { if (disposing) { ImmediateContext.ClearState(); Util.ReleaseCom(ref _shapesVB); Util.ReleaseCom(ref _shapesIB); Util.ReleaseCom(ref _skullVB); Util.ReleaseCom(ref _skullIB); Util.ReleaseCom(ref _floorTexSRV); Util.ReleaseCom(ref _stoneTexSRV); Util.ReleaseCom(ref _brickTexSRV); Effects.DestroyAll(); InputLayouts.DestroyAll(); } _disposed = true; } base.Dispose(disposing); }
public override void DrawScene() { ImmediateContext.ClearRenderTargetView(RenderTargetView, Color.LightSteelBlue); ImmediateContext.ClearDepthStencilView(DepthStencilView, DepthStencilClearFlags.Depth | DepthStencilClearFlags.Stencil, 1.0f, 0); ImmediateContext.InputAssembler.InputLayout = InputLayouts.Basic32; ImmediateContext.InputAssembler.PrimitiveTopology = PrimitiveTopology.TriangleList; var viewProj = _view * _proj; _fx.SetDirLights(_dirLights); _fx.SetEyePosW(_eyePosW); var activeTech = _fx.Light2TexTech; for (int p = 0; p < activeTech.Description.PassCount; p++) { ImmediateContext.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(_boxVB, Basic32.Stride, 0)); ImmediateContext.InputAssembler.SetIndexBuffer(_boxIB, Format.R32_UInt, 0); var world = _boxWorld; var wit = MathF.InverseTranspose(world); var wvp = world * viewProj; _fx.SetWorld(world); _fx.SetWorldInvTranspose(wit); _fx.SetWorldViewProj(wvp); _fx.SetTexTransform(_texTransform); _fx.SetMaterial(_boxMat); _fx.SetDiffuseMap(_diffuseMapSRV); activeTech.GetPassByIndex(p).Apply(ImmediateContext); ImmediateContext.DrawIndexed(_boxIndexCount, _boxIndexOffset, _boxVertexOffset); } SwapChain.Present(0, PresentFlags.None); }
/// <summary> /// Renders to ping pong buffer. /// </summary> /// <param name="context">The context.</param> /// <param name="parameter">The parameter.</param> public virtual void RenderToPingPongBuffer(RenderContext context, ref RenderParameter parameter) { var buffer = context.RenderHost.RenderBuffer; buffer.FullResPPBuffer.Initialize(); if (context.RenderHost.FeatureLevel < global::SharpDX.Direct3D.FeatureLevel.Level_11_0 || context.RenderHost.RenderConfiguration.FXAALevel == FXAALevel.None || parameter.IsMSAATexture) { if (parameter.IsMSAATexture) { ImmediateContext.ResolveSubresource(parameter.CurrentTargetTexture, 0, buffer.FullResPPBuffer.CurrentTexture, 0, buffer.Format); } else { ImmediateContext.CopyResource(parameter.CurrentTargetTexture, buffer.FullResPPBuffer.CurrentTexture); } } else { ImmediateContext.CopyResource(parameter.CurrentTargetTexture, buffer.FullResPPBuffer.CurrentTexture); postFXAACore.FXAALevel = context.RenderHost.RenderConfiguration.FXAALevel; postFXAACore.Render(context, ImmediateContext); } }
public override void DrawScene() { Effects.BasicFX.SetShadowMap(null); Effects.NormalMapFX.SetShadowMap(null); _sMap.BindDsvAndSetNullRenderTarget(ImmediateContext); DrawSceneToShadowMap(); ImmediateContext.Rasterizer.State = null; ImmediateContext.OutputMerger.SetTargets(DepthStencilView, RenderTargetView); ImmediateContext.Rasterizer.SetViewports(Viewport); ImmediateContext.ClearRenderTargetView(RenderTargetView, Color.Silver); ImmediateContext.ClearDepthStencilView(DepthStencilView, DepthStencilClearFlags.Depth | DepthStencilClearFlags.Stencil, 1.0f, 0); var viewProj = _camera.ViewProj; var view = _camera.View; var proj = _camera.Proj; Effects.BasicFX.SetDirLights(_dirLights); Effects.BasicFX.SetEyePosW(_camera.Position); Effects.BasicFX.SetCubeMap(_sky.CubeMapSRV); Effects.BasicFX.SetShadowMap(_sMap.DepthMapSRV); Effects.NormalMapFX.SetDirLights(_dirLights); Effects.NormalMapFX.SetEyePosW(_camera.Position); Effects.NormalMapFX.SetCubeMap(_sky.CubeMapSRV); Effects.NormalMapFX.SetShadowMap(_sMap.DepthMapSRV); var activeTech = Effects.NormalMapFX.Light3TexTech; var activeSphereTech = Effects.BasicFX.Light3ReflectTech; var activeSkullTech = Effects.BasicFX.Light3ReflectTech; ImmediateContext.InputAssembler.InputLayout = InputLayouts.PosNormalTexTan; if (Util.IsKeyDown(Keys.W)) { ImmediateContext.Rasterizer.State = RenderStates.WireframeRS; } for (var p = 0; p < activeTech.Description.PassCount; p++) { // draw grid var pass = activeTech.GetPassByIndex(p); _grid.ShadowTransform = _shadowTransform; _grid.Draw(ImmediateContext, pass, view, proj); // draw box _box.ShadowTransform = _shadowTransform; _box.Draw(ImmediateContext, pass, view, proj); // draw columns foreach (var cylinder in _cylinders) { cylinder.ShadowTransform = _shadowTransform; cylinder.Draw(ImmediateContext, pass, view, proj); } } ImmediateContext.HullShader.Set(null); ImmediateContext.DomainShader.Set(null); ImmediateContext.InputAssembler.PrimitiveTopology = PrimitiveTopology.TriangleList; for (var p = 0; p < activeSphereTech.Description.PassCount; p++) { var pass = activeSphereTech.GetPassByIndex(p); foreach (var sphere in _spheres) { sphere.ShadowTransform = _shadowTransform; sphere.Draw(ImmediateContext, pass, view, proj, RenderMode.Basic); } } var stride = Basic32.Stride; const int offset = 0; ImmediateContext.Rasterizer.State = null; ImmediateContext.InputAssembler.InputLayout = InputLayouts.Basic32; ImmediateContext.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(_skullVB, stride, offset)); ImmediateContext.InputAssembler.SetIndexBuffer(_skullIB, Format.R32_UInt, 0); for (var p = 0; p < activeSkullTech.Description.PassCount; p++) { var world = _skullWorld; var wit = MathF.InverseTranspose(world); var wvp = world * viewProj; Effects.BasicFX.SetWorld(world); Effects.BasicFX.SetWorldInvTranspose(wit); Effects.BasicFX.SetWorldViewProj(wvp); Effects.BasicFX.SetShadowTransform(world * _shadowTransform); Effects.BasicFX.SetMaterial(_skullMat); activeSkullTech.GetPassByIndex(p).Apply(ImmediateContext); ImmediateContext.DrawIndexed(_skullIndexCount, 0, 0); } DrawScreenQuad(); _sky.Draw(ImmediateContext, _camera); ImmediateContext.Rasterizer.State = null; ImmediateContext.OutputMerger.DepthStencilState = null; ImmediateContext.OutputMerger.DepthStencilReference = 0; SwapChain.Present(0, PresentFlags.None); }
/// <summary> /// Initializes a new instance of the <see cref="GlxDisplay" /> class. /// </summary> /// <param name="x11">The X11.</param> /// <exception cref="OpenGlException">Unable to choose FBConfig /// or /// Unable to get visual info from FBConfig /// or /// GL version string is null, aborting /// or /// GL renderer string is null, aborting /// or /// Renderer '{GlInterface.Renderer}' is blacklisted by '{item}'</exception> public GlxDisplay(X11Info x11) { _x11 = x11; var baseAttribs = new[] { GLX_X_RENDERABLE, 1, GLX_RENDER_TYPE, GLX_RGBA_BIT, GLX_DRAWABLE_TYPE, GLX_WINDOW_BIT | GLX_PBUFFER_BIT, GLX_DOUBLEBUFFER, 1, GLX_RED_SIZE, 8, GLX_GREEN_SIZE, 8, GLX_BLUE_SIZE, 8, GLX_ALPHA_SIZE, 8, GLX_DEPTH_SIZE, 1, GLX_STENCIL_SIZE, 8, }; foreach (var attribs in new[] { //baseAttribs.Concat(multiattribs), baseAttribs, }) { var ptr = Glx.ChooseFBConfig(_x11.Display, x11.DefaultScreen, attribs, out var count); for (var c = 0; c < count; c++) { var visual = Glx.GetVisualFromFBConfig(_x11.Display, ptr[c]); // We prefer 32 bit visuals if (_fbconfig == IntPtr.Zero || visual->depth == 32) { _fbconfig = ptr[c]; VisualInfo = visual; if (visual->depth == 32) { break; } } } if (_fbconfig != IntPtr.Zero) { break; } } if (_fbconfig == IntPtr.Zero) { throw new OpenGlException("Unable to choose FBConfig"); } if (VisualInfo == null) { throw new OpenGlException("Unable to get visual info from FBConfig"); } if (Glx.GetFBConfigAttrib(_x11.Display, _fbconfig, GLX_SAMPLES, out var samples) == 0) { SampleCount = samples; } if (Glx.GetFBConfigAttrib(_x11.Display, _fbconfig, GLX_STENCIL_SIZE, out var stencil) == 0) { StencilSize = stencil; } var pbuffers = Enumerable.Range(0, 2).Select(_ => Glx.CreatePbuffer(_x11.Display, _fbconfig, new[] { GLX_PBUFFER_WIDTH, 1, GLX_PBUFFER_HEIGHT, 1, 0 })).ToList(); XLib.XFlush(_x11.Display); ImmediateContext = CreateContext(pbuffers[0], null); DeferredContext = CreateContext(pbuffers[1], ImmediateContext); ImmediateContext.MakeCurrent(); var err = Glx.GetError(); GlInterface = new GlInterface(GlxInterface.SafeGetProcAddress); if (GlInterface.Version == null) { throw new OpenGlException("GL version string is null, aborting"); } if (GlInterface.Renderer == null) { throw new OpenGlException("GL renderer string is null, aborting"); } if (Environment.GetEnvironmentVariable("AVALONIA_GLX_IGNORE_RENDERER_BLACKLIST") != "1") { var blacklist = AvaloniaLocator.Current.GetService <X11PlatformOptions>() ?.GlxRendererBlacklist; if (blacklist != null) { foreach (var item in blacklist) { if (GlInterface.Renderer.Contains(item)) { throw new OpenGlException($"Renderer '{GlInterface.Renderer}' is blacklisted by '{item}'"); } } } } }
public override void DrawScene() { var start = Stopwatch.GetTimestamp(); base.DrawScene(); ImmediateContext.ClearRenderTargetView(RenderTargetView, Color.Silver); ImmediateContext.ClearDepthStencilView( DepthStencilView, DepthStencilClearFlags.Depth | DepthStencilClearFlags.Stencil, 1.0f, 0 ); ImmediateContext.InputAssembler.InputLayout = InputLayouts.InstancedBasic32; ImmediateContext.InputAssembler.PrimitiveTopology = PrimitiveTopology.TriangleList; var stride = new[] { Basic32.Stride, Marshal.SizeOf(typeof(InstancedData)) }; var offset = new[] { 0, 0 }; var viewProj = _cam.ViewProj; Effects.InstancedBasicFX.SetDirLights(_dirLights); Effects.InstancedBasicFX.SetEyePosW(_cam.Position); Effects.BasicFX.SetDirLights(_dirLights); Effects.BasicFX.SetEyePosW(_cam.Position); var activeTech = _instancing ? Effects.InstancedBasicFX.Light3Tech : Effects.BasicFX.Light3Tech; if (_skullsOrBoxes) { for (int p = 0; p < activeTech.Description.PassCount; p++) { if (_instancing) { ImmediateContext.InputAssembler.SetVertexBuffers( 0, new VertexBufferBinding(_skullVB, stride[0], offset[0]), new VertexBufferBinding(_instanceBuffer, stride[1], offset[1]) ); ImmediateContext.InputAssembler.SetIndexBuffer(_skullIB, Format.R32_UInt, 0); Effects.InstancedBasicFX.SetViewProj(viewProj); Effects.InstancedBasicFX.SetMaterial(_skullMat); activeTech.GetPassByIndex(p).Apply(ImmediateContext); ImmediateContext.DrawIndexedInstanced(_skullIndexCount, _visibleObjectCount, 0, 0, 0); } else { ImmediateContext.InputAssembler.SetVertexBuffers( 0, new VertexBufferBinding(_skullVB, stride[0], offset[0]) ); ImmediateContext.InputAssembler.SetIndexBuffer(_skullIB, Format.R32_UInt, 0); Effects.BasicFX.SetMaterial(_skullMat); foreach (var data in _instancedData) { var world = data.World; var wit = MathF.InverseTranspose(world); var wvp = world * _cam.ViewProj; Effects.BasicFX.SetWorld(world); Effects.BasicFX.SetWorldInvTranspose(wit); Effects.BasicFX.SetWorldViewProj(wvp); activeTech.GetPassByIndex(p).Apply(ImmediateContext); ImmediateContext.DrawIndexed(_skullIndexCount, 0, 0); } } } } else { for (int p = 0; p < activeTech.Description.PassCount; p++) { if (_instancing) { ImmediateContext.InputAssembler.SetVertexBuffers( 0, new VertexBufferBinding(_boxVB, stride[0], offset[0]), new VertexBufferBinding(_instanceBuffer, stride[1], offset[1]) ); ImmediateContext.InputAssembler.SetIndexBuffer(_boxIB, Format.R32_UInt, 0); Effects.InstancedBasicFX.SetViewProj(viewProj); Effects.InstancedBasicFX.SetMaterial(_skullMat); activeTech.GetPassByIndex(p).Apply(ImmediateContext); ImmediateContext.DrawIndexedInstanced(36, _visibleObjectCount, 0, 0, 0); } else { ImmediateContext.InputAssembler.SetVertexBuffers( 0, new VertexBufferBinding(_boxVB, stride[0], offset[0]) ); ImmediateContext.InputAssembler.SetIndexBuffer(_boxIB, Format.R32_UInt, 0); Effects.BasicFX.SetMaterial(_skullMat); foreach (var data in _instancedData) { var world = data.World; var wit = MathF.InverseTranspose(world); var wvp = world * _cam.ViewProj; Effects.BasicFX.SetWorld(world); Effects.BasicFX.SetWorldInvTranspose(wit); Effects.BasicFX.SetWorldViewProj(wvp); activeTech.GetPassByIndex(p).Apply(ImmediateContext); ImmediateContext.DrawIndexed(36, 0, 0); } } } } SwapChain.Present(0, PresentFlags.None); var elapsed = ((float)(Stopwatch.GetTimestamp() - start)) / Stopwatch.Frequency; Console.WriteLine("frame time: {0} msec", elapsed * 1000); }
public override void UpdateScene(float dt) { base.UpdateScene(dt); if (Util.IsKeyDown(Keys.Up)) { _cam.Walk(10.0f * dt); } if (Util.IsKeyDown(Keys.Down)) { _cam.Walk(-10.0f * dt); } if (Util.IsKeyDown(Keys.Left)) { _cam.Strafe(-10.0f * dt); } if (Util.IsKeyDown(Keys.Right)) { _cam.Strafe(10.0f * dt); } if (Util.IsKeyDown(Keys.D1)) { _frustumCullingEnabled = true; } if (Util.IsKeyDown(Keys.D2)) { _frustumCullingEnabled = false; } if (Util.IsKeyDown(Keys.U)) { _instancing = false; } if (Util.IsKeyDown(Keys.I)) { _instancing = true; } if (Util.IsKeyDown(Keys.B)) { _skullsOrBoxes = false; } if (Util.IsKeyDown(Keys.S)) { _skullsOrBoxes = true; } _cam.UpdateViewMatrix(); _visibleObjectCount = 0; if (_frustumCullingEnabled) { var db = ImmediateContext.MapSubresource(_instanceBuffer, MapMode.WriteDiscard, MapFlags.None); foreach (var instancedData in _instancedData) { var w = instancedData.World; var box = new BoundingBox( Vector3.TransformCoordinate(_skullBox.Minimum, w), Vector3.TransformCoordinate(_skullBox.Maximum, w) ); if (_cam.Visible(box)) { db.Data.Write(instancedData); _visibleObjectCount++; } } ImmediateContext.UnmapSubresource(_instanceBuffer, 0); } else { var db = ImmediateContext.MapSubresource(_instanceBuffer, MapMode.WriteDiscard, MapFlags.None); foreach (var instancedData in _instancedData) { db.Data.Write(instancedData); _visibleObjectCount++; } ImmediateContext.UnmapSubresource(_instanceBuffer, 0); } MainWindowCaption = String.Format("Instancing and Culling Demo {0} objects visible out of {1}", _visibleObjectCount, _instancedData.Count); }
public override void DrawScene() { ImmediateContext.ClearRenderTargetView(RenderTargetView, Color.Silver); ImmediateContext.ClearDepthStencilView(DepthStencilView, DepthStencilClearFlags.Depth | DepthStencilClearFlags.Stencil, 1.0f, 0); ImmediateContext.InputAssembler.InputLayout = InputLayouts.Basic32; ImmediateContext.InputAssembler.PrimitiveTopology = PrimitiveTopology.TriangleList; Matrix view; Matrix proj; Matrix viewProj; if (_useFpsCamera) { _cam.UpdateViewMatrix(); view = _cam.View; proj = _cam.Proj; viewProj = _cam.ViewProj; Effects.BasicFX.SetEyePosW(_cam.Position); } else { _cam2.UpdateViewMatrix(); view = _cam2.View; proj = _cam2.Proj; viewProj = _cam2.ViewProj; Effects.BasicFX.SetEyePosW(_cam2.Position); } Effects.BasicFX.SetDirLights(_dirLights); var activeTexTech = Effects.BasicFX.Light1TexTech; var activeSkullTech = Effects.BasicFX.Light1Tech; switch (_lightCount) { case 1: activeTexTech = Effects.BasicFX.Light1TexTech; activeSkullTech = Effects.BasicFX.Light1Tech; break; case 2: activeTexTech = Effects.BasicFX.Light2TexTech; activeSkullTech = Effects.BasicFX.Light2Tech; break; case 3: activeTexTech = Effects.BasicFX.Light3TexTech; activeSkullTech = Effects.BasicFX.Light3Tech; break; } for (var p = 0; p < activeTexTech.Description.PassCount; p++) { var pass = activeTexTech.GetPassByIndex(p); ImmediateContext.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(_shapesVB, Basic32.Stride, 0)); ImmediateContext.InputAssembler.SetIndexBuffer(_shapesIB, Format.R32_UInt, 0); var world = _gridWorld; var worldInvTranspose = MathF.InverseTranspose(world); var wvp = world * view * proj; Effects.BasicFX.SetWorld(world); Effects.BasicFX.SetWorldInvTranspose(worldInvTranspose); Effects.BasicFX.SetWorldViewProj(wvp); Effects.BasicFX.SetTexTransform(Matrix.Scaling(6, 8, 1)); Effects.BasicFX.SetMaterial(_gridMat); Effects.BasicFX.SetDiffuseMap(_floorTexSRV); pass.Apply(ImmediateContext); ImmediateContext.DrawIndexed(_gridIndexCount, _gridIndexOffset, _gridVertexOffset); world = _boxWorld; worldInvTranspose = MathF.InverseTranspose(world); wvp = world * viewProj; Effects.BasicFX.SetWorld(world); Effects.BasicFX.SetWorldInvTranspose(worldInvTranspose); Effects.BasicFX.SetWorldViewProj(wvp); Effects.BasicFX.SetTexTransform(Matrix.Identity); Effects.BasicFX.SetMaterial(_boxMat); Effects.BasicFX.SetDiffuseMap(_stoneTexSRV); pass.Apply(ImmediateContext); ImmediateContext.DrawIndexed(_boxIndexCount, _boxIndexOffset, _boxVertexOffset); foreach (var matrix in _cylWorld) { world = matrix; worldInvTranspose = MathF.InverseTranspose(world); wvp = world * viewProj; Effects.BasicFX.SetWorld(world); Effects.BasicFX.SetWorldInvTranspose(worldInvTranspose); Effects.BasicFX.SetWorldViewProj(wvp); Effects.BasicFX.SetTexTransform(Matrix.Identity); Effects.BasicFX.SetMaterial(_cylinderMat); Effects.BasicFX.SetDiffuseMap(_brickTexSRV); pass.Apply(ImmediateContext); ImmediateContext.DrawIndexed(_cylinderIndexCount, _cylinderIndexOffset, _cylinderVertexOffset); } foreach (var matrix in _sphereWorld) { world = matrix; worldInvTranspose = MathF.InverseTranspose(world); wvp = world * viewProj; Effects.BasicFX.SetWorld(world); Effects.BasicFX.SetWorldInvTranspose(worldInvTranspose); Effects.BasicFX.SetWorldViewProj(wvp); Effects.BasicFX.SetTexTransform(Matrix.Identity); Effects.BasicFX.SetMaterial(_sphereMat); Effects.BasicFX.SetDiffuseMap(_stoneTexSRV); pass.Apply(ImmediateContext); ImmediateContext.DrawIndexed(_sphereIndexCount, _sphereIndexOffset, _sphereVertexOffset); } } for (int p = 0; p < activeSkullTech.Description.PassCount; p++) { var pass = activeSkullTech.GetPassByIndex(p); ImmediateContext.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(_skullVB, Basic32.Stride, 0)); ImmediateContext.InputAssembler.SetIndexBuffer(_skullIB, Format.R32_UInt, 0); var world = _skullWorld; var worldInvTranspose = MathF.InverseTranspose(world); var wvp = world * viewProj; Effects.BasicFX.SetWorld(world); Effects.BasicFX.SetWorldInvTranspose(worldInvTranspose); Effects.BasicFX.SetWorldViewProj(wvp); Effects.BasicFX.SetMaterial(_skullMat); pass.Apply(ImmediateContext); ImmediateContext.DrawIndexed(_skullIndexCount, 0, 0); } SwapChain.Present(0, PresentFlags.None); }
public override void DrawScene() { Effects.TerrainFX.SetSsaoMap(_whiteTex); Effects.TerrainFX.SetShadowMap(_sMap.DepthMapSRV); Effects.TerrainFX.SetShadowTransform(_shadowTransform); _minimap.RenderMinimap(_dirLights); var viewProj = _lightView * _lightProj; _terrain.Renderer.DrawToShadowMap(ImmediateContext, _sMap, viewProj); ImmediateContext.Rasterizer.State = null; ImmediateContext.ClearDepthStencilView(DepthStencilView, DepthStencilClearFlags.Depth | DepthStencilClearFlags.Stencil, 1.0f, 0); ImmediateContext.Rasterizer.SetViewports(Viewport); _terrain.Renderer.ComputeSsao(ImmediateContext, _camera, _ssao, DepthStencilView); ImmediateContext.OutputMerger.SetTargets(DepthStencilView, RenderTargetView); ImmediateContext.Rasterizer.SetViewports(Viewport); ImmediateContext.ClearRenderTargetView(RenderTargetView, Color.Silver); ImmediateContext.ClearDepthStencilView(DepthStencilView, DepthStencilClearFlags.Depth | DepthStencilClearFlags.Stencil, 1.0f, 0); if (Util.IsKeyDown(Keys.W)) { ImmediateContext.Rasterizer.State = RenderStates.WireframeRS; } if (Util.IsKeyDown(Keys.S)) { Effects.TerrainFX.SetSsaoMap(_whiteTex); } else { Effects.TerrainFX.SetSsaoMap(_ssao.AmbientSRV); } Effects.TerrainFX.SetShadowMap(_sMap.DepthMapSRV); Effects.TerrainFX.SetShadowTransform(_shadowTransform); if (!Util.IsKeyDown(Keys.A)) { _terrain.Renderer.Shadows = true; } else { _terrain.Renderer.Shadows = false; } _terrain.Renderer.Draw(ImmediateContext, _camera, _dirLights); ImmediateContext.Rasterizer.State = null; _sky.Draw(ImmediateContext, _camera); ImmediateContext.Rasterizer.State = null; ImmediateContext.OutputMerger.DepthStencilState = null; ImmediateContext.OutputMerger.DepthStencilReference = 0; DrawScreenQuad(_ssao.AmbientSRV); DrawScreenQuad2(_ssao.NormalDepthSRV); DrawScreenQuad3(_sMap.DepthMapSRV); _minimap.Draw(ImmediateContext); SwapChain.Present(0, PresentFlags.None); }
private void DrawSkullShadow(EffectTechnique activeSkullTech, Matrix viewProj, Color4 blendFactor) { // draw skull shadow on floor for (int p = 0; p < activeSkullTech.Description.PassCount; p++) { var pass = activeSkullTech.GetPassByIndex(p); ImmediateContext.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(_skullVB, Basic32.Stride, 0)); ImmediateContext.InputAssembler.SetIndexBuffer(_skullIB, Format.R32_UInt, 0); var shadowPlane = new Plane(new Vector3(0, 1, 0), 0.0f); var toMainLight = -_dirLights[0].Direction; var s = Matrix.Shadow(new Vector4(toMainLight, 0), shadowPlane); var shadowOffsetY = Matrix.Translation(0, 0.001f, 0); var world = _skullWorld * s * shadowOffsetY; var wit = MathF.InverseTranspose(world); var wvp = world * viewProj; Effects.BasicFX.SetWorld(world); Effects.BasicFX.SetWorldInvTranspose(wit); Effects.BasicFX.SetWorldViewProj(wvp); Effects.BasicFX.SetMaterial(_shadowMat); ImmediateContext.OutputMerger.BlendState = RenderStates.TransparentBS; ImmediateContext.OutputMerger.BlendFactor = blendFactor; ImmediateContext.OutputMerger.BlendSampleMask = -1; ImmediateContext.OutputMerger.DepthStencilState = RenderStates.NoDoubleBlendDSS; ImmediateContext.OutputMerger.DepthStencilReference = 0; pass.Apply(ImmediateContext); ImmediateContext.DrawIndexed(_skullIndexCount, 0, 0); // draw skull shadow on wall shadowPlane = new Plane(new Vector3(0, 0, -1), 0.0f); toMainLight = -_dirLights[0].Direction; s = Matrix.Shadow(new Vector4(toMainLight, 0), shadowPlane); shadowOffsetY = Matrix.Translation(0, 0, -0.001f); world = _skullWorld * s * shadowOffsetY; wit = MathF.InverseTranspose(world); wvp = world * viewProj; Effects.BasicFX.SetWorld(world); Effects.BasicFX.SetWorldInvTranspose(wit); Effects.BasicFX.SetWorldViewProj(wvp); Effects.BasicFX.SetMaterial(_shadowMat); pass.Apply(ImmediateContext); ImmediateContext.DrawIndexed(_skullIndexCount, 0, 0); ImmediateContext.Rasterizer.State = null; ImmediateContext.OutputMerger.DepthStencilState = null; ImmediateContext.OutputMerger.DepthStencilReference = 0; ImmediateContext.OutputMerger.BlendState = null; ImmediateContext.OutputMerger.BlendFactor = blendFactor; ImmediateContext.OutputMerger.BlendSampleMask = -1; } }
private void DrawSkullShadowReflection(EffectTechnique activeSkullTech, Matrix viewProj, Color4 blendFactor) { // draw skull shadow for (int p = 0; p < activeSkullTech.Description.PassCount; p++) { var pass = activeSkullTech.GetPassByIndex(p); ImmediateContext.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(_skullVB, Basic32.Stride, 0)); ImmediateContext.InputAssembler.SetIndexBuffer(_skullIB, Format.R32_UInt, 0); var shadowPlane = new Plane(new Vector3(0, 1, 0), 0.0f); var toMainLight = -_dirLights[0].Direction; var s = Matrix.Shadow(new Vector4(toMainLight, 0), shadowPlane); var shadowOffsetY = Matrix.Translation(0, 0.001f, 0); var mirrorPlane = new Plane(new Vector3(0, 0, 1), 0); var r = Matrix.Reflection(mirrorPlane); var world = _skullWorld * s * shadowOffsetY * r; var wit = MathF.InverseTranspose(world); var wvp = world * viewProj; Effects.BasicFX.SetWorld(world); Effects.BasicFX.SetWorldInvTranspose(wit); Effects.BasicFX.SetWorldViewProj(wvp); Effects.BasicFX.SetMaterial(_shadowMat); ImmediateContext.OutputMerger.BlendState = RenderStates.TransparentBS; ImmediateContext.OutputMerger.BlendFactor = blendFactor; ImmediateContext.OutputMerger.BlendSampleMask = -1; var oldLightDirections = _dirLights.Select(l => l.Direction).ToArray(); for (int i = 0; i < _dirLights.Length; i++) { var l = _dirLights[i]; var lightDir = l.Direction; var reflectedLightDir = Vector3.Transform(lightDir, r); _dirLights[i].Direction = new Vector3(reflectedLightDir.X, reflectedLightDir.Y, reflectedLightDir.Z); } Effects.BasicFX.SetDirLights(_dirLights); ImmediateContext.Rasterizer.State = RenderStates.CullClockwiseRS; ImmediateContext.OutputMerger.DepthStencilState = RenderStates.NoDoubleBlendDSS; ImmediateContext.OutputMerger.DepthStencilReference = 1; pass.Apply(ImmediateContext); ImmediateContext.DrawIndexed(_skullIndexCount, 0, 0); ImmediateContext.Rasterizer.State = null; ImmediateContext.OutputMerger.DepthStencilState = null; ImmediateContext.OutputMerger.DepthStencilReference = 0; ImmediateContext.OutputMerger.BlendState = null; ImmediateContext.OutputMerger.BlendFactor = blendFactor; ImmediateContext.OutputMerger.BlendSampleMask = -1; for (int i = 0; i < oldLightDirections.Length; i++) { _dirLights[i].Direction = oldLightDirections[i]; } Effects.BasicFX.SetDirLights(_dirLights); } }
public override void DrawScene() { Effects.TerrainFX.SetSsaoMap(_whiteTex); Effects.TerrainFX.SetShadowMap(_sMap.DepthMapSRV); Effects.TerrainFX.SetShadowTransform(_shadowTransform); _minimap.RenderMinimap(_dirLights); var view = _lightView; var proj = _lightProj; var viewProj = view * proj; _terrain.Renderer.DrawToShadowMap(ImmediateContext, _sMap, viewProj); DrawSceneToShadowMap(); ImmediateContext.Rasterizer.State = null; ImmediateContext.ClearDepthStencilView(DepthStencilView, DepthStencilClearFlags.Depth | DepthStencilClearFlags.Stencil, 1.0f, 0); ImmediateContext.Rasterizer.SetViewports(Viewport); _terrain.Renderer.ComputeSsao(ImmediateContext, _camera, _ssao, DepthStencilView); ImmediateContext.OutputMerger.SetTargets(DepthStencilView, RenderTargetView); ImmediateContext.Rasterizer.SetViewports(Viewport); ImmediateContext.ClearRenderTargetView(RenderTargetView, Color.Silver); ImmediateContext.ClearDepthStencilView(DepthStencilView, DepthStencilClearFlags.Depth | DepthStencilClearFlags.Stencil, 1.0f, 0); if (Util.IsKeyDown(Keys.W)) { ImmediateContext.Rasterizer.State = RenderStates.WireframeRS; } if (Util.IsKeyDown(Keys.S)) { Effects.TerrainFX.SetSsaoMap(_whiteTex); } else { Effects.TerrainFX.SetSsaoMap(_ssao.AmbientSRV); } if (!Util.IsKeyDown(Keys.A)) { Effects.TerrainFX.SetShadowMap(_sMap.DepthMapSRV); Effects.TerrainFX.SetShadowTransform(_shadowTransform); } else { Effects.TerrainFX.SetShadowMap(_whiteTex); } Effects.BasicFX.SetEyePosW(_camera.Position); Effects.BasicFX.SetDirLights(_dirLights); Effects.BasicFX.SetSsaoMap(_whiteTex); ImmediateContext.InputAssembler.InputLayout = InputLayouts.Basic32; ImmediateContext.InputAssembler.PrimitiveTopology = PrimitiveTopology.TriangleList; for (var p = 0; p < Effects.BasicFX.Light1Tech.Description.PassCount; p++) { var pass = Effects.BasicFX.Light1Tech.GetPassByIndex(p); _unit.Render(ImmediateContext, pass, _camera.View, _camera.Proj); } _terrain.Renderer.Draw(ImmediateContext, _camera, _dirLights); ImmediateContext.Rasterizer.State = null; _sky.Draw(ImmediateContext, _camera); ImmediateContext.Rasterizer.State = null; ImmediateContext.OutputMerger.DepthStencilState = null; ImmediateContext.OutputMerger.DepthStencilReference = 0; _minimap.Draw(ImmediateContext); FontCache.DrawStrings( new[] { "Currently: " + _unit.Position, "Destination: " + _unit.Destination.MapPosition }, Vector2.Zero, Color.Yellow ); FontCache.DrawString("bold", "This is bold", new Vector2(Window.ClientSize.Width - 200, 0), Color.Red); EndFrame(); }
public override void DrawScene() { ImmediateContext.ClearRenderTargetView(RenderTargetView, Color.LightSteelBlue); ImmediateContext.ClearDepthStencilView(DepthStencilView, DepthStencilClearFlags.Depth | DepthStencilClearFlags.Stencil, 1.0f, 0); ImmediateContext.InputAssembler.InputLayout = InputLayouts.PosNormal; ImmediateContext.InputAssembler.PrimitiveTopology = PrimitiveTopology.TriangleList; var viewProj = _view * _proj; _fx.SetDirLights(_dirLights); _fx.SetEyePosW(_eyePosW); var activeTech = _fx.Light1Tech; switch (_lightCount) { case 1: activeTech = _fx.Light1Tech; break; case 2: activeTech = _fx.Light2Tech; break; case 3: activeTech = _fx.Light3Tech; break; } for (var p = 0; p < activeTech.Description.PassCount; p++) { var pass = activeTech.GetPassByIndex(p); ImmediateContext.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(_shapesVB, VertexPN.Stride, 0)); ImmediateContext.InputAssembler.SetIndexBuffer(_shapesIB, Format.R32_UInt, 0); var world = _gridWorld; var worldInvTranspose = MathF.InverseTranspose(world); var wvp = world * viewProj; _fx.SetWorld(world); _fx.SetWorldInvTranspose(worldInvTranspose); _fx.SetWorldViewProj(wvp); _fx.SetMaterial(_gridMat); pass.Apply(ImmediateContext); ImmediateContext.DrawIndexed(_gridIndexCount, _gridIndexOffset, _gridVertexOffset); world = _boxWorld; worldInvTranspose = MathF.InverseTranspose(world); wvp = world * viewProj; _fx.SetWorld(world); _fx.SetWorldInvTranspose(worldInvTranspose); _fx.SetWorldViewProj(wvp); _fx.SetMaterial(_boxMat); pass.Apply(ImmediateContext); ImmediateContext.DrawIndexed(_boxIndexCount, _boxIndexOffset, _boxVertexOffset); foreach (var matrix in _cylWorld) { world = matrix; worldInvTranspose = MathF.InverseTranspose(world); wvp = world * viewProj; _fx.SetWorld(world); _fx.SetWorldInvTranspose(worldInvTranspose); _fx.SetWorldViewProj(wvp); _fx.SetMaterial(_cylinderMat); pass.Apply(ImmediateContext); ImmediateContext.DrawIndexed(_cylinderIndexCount, _cylinderIndexOffset, _cylinderVertexOffset); } foreach (var matrix in _sphereWorld) { world = matrix; worldInvTranspose = MathF.InverseTranspose(world); wvp = world * viewProj; _fx.SetWorld(world); _fx.SetWorldInvTranspose(worldInvTranspose); _fx.SetWorldViewProj(wvp); _fx.SetMaterial(_sphereMat); pass.Apply(ImmediateContext); ImmediateContext.DrawIndexed(_sphereIndexCount, _sphereIndexOffset, _sphereVertexOffset); } ImmediateContext.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(_skullVB, VertexPN.Stride, 0)); ImmediateContext.InputAssembler.SetIndexBuffer(_skullIB, Format.R32_UInt, 0); world = _skullWorld; worldInvTranspose = MathF.InverseTranspose(world); wvp = world * viewProj; _fx.SetWorld(world); _fx.SetWorldInvTranspose(worldInvTranspose); _fx.SetWorldViewProj(wvp); _fx.SetMaterial(_skullMat); pass.Apply(ImmediateContext); ImmediateContext.DrawIndexed(_skullIndexCount, 0, 0); } SwapChain.Present(0, PresentFlags.None); }
private void DrawSceneToShadowMap() { try { var view = _lightView; var proj = _lightProj; var viewProj = view * proj; Effects.BuildShadowMapFX.SetEyePosW(_camera.Position); Effects.BuildShadowMapFX.SetViewProj(viewProj); ImmediateContext.InputAssembler.PrimitiveTopology = PrimitiveTopology.TriangleList; var smapTech = Effects.BuildShadowMapFX.BuildShadowMapTech; const int offset = 0; ImmediateContext.InputAssembler.InputLayout = InputLayouts.PosNormalTexTan; if (Util.IsKeyDown(Keys.W)) { ImmediateContext.Rasterizer.State = RenderStates.WireframeRS; } for (var p = 0; p < smapTech.Description.PassCount; p++) { var pass = smapTech.GetPassByIndex(p); _grid.Draw(ImmediateContext, pass, view, proj, RenderMode.ShadowMap); _box.Draw(ImmediateContext, pass, view, proj, RenderMode.ShadowMap); foreach (var cylinder in _cylinders) { cylinder.Draw(ImmediateContext, pass, view, proj, RenderMode.ShadowMap); } } ImmediateContext.HullShader.Set(null); ImmediateContext.DomainShader.Set(null); ImmediateContext.InputAssembler.PrimitiveTopology = PrimitiveTopology.TriangleList; for (var p = 0; p < smapTech.Description.PassCount; p++) { var pass = smapTech.GetPassByIndex(p); foreach (var sphere in _spheres) { sphere.Draw(ImmediateContext, pass, view, proj, RenderMode.ShadowMap); } } var stride = Basic32.Stride; ImmediateContext.Rasterizer.State = null; ImmediateContext.InputAssembler.InputLayout = InputLayouts.Basic32; ImmediateContext.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(_skullVB, stride, offset)); ImmediateContext.InputAssembler.SetIndexBuffer(_skullIB, Format.R32_UInt, 0); for (var p = 0; p < smapTech.Description.PassCount; p++) { var world = _skullWorld; var wit = MathF.InverseTranspose(world); var wvp = world * viewProj; Effects.BuildShadowMapFX.SetWorld(world); Effects.BuildShadowMapFX.SetWorldInvTranspose(wit); Effects.BuildShadowMapFX.SetWorldViewProj(wvp); Effects.BuildShadowMapFX.SetTexTransform(Matrix.Scaling(1, 2, 1)); smapTech.GetPassByIndex(p).Apply(ImmediateContext); ImmediateContext.DrawIndexed(_skullIndexCount, 0, 0); } } catch (Exception ex) { Console.WriteLine(ex.Message); } }
public override void DrawScene() { base.DrawScene(); ImmediateContext.ClearRenderTargetView(RenderTargetView, Color.Silver); ImmediateContext.ClearDepthStencilView(DepthStencilView, DepthStencilClearFlags.Depth | DepthStencilClearFlags.Stencil, 1.0f, 0); _camera.UpdateViewMatrix(); var view = _camera.View; var proj = _camera.Proj; var viewProj = _camera.ViewProj; var blendFactor = new Color4(0, 0, 0, 0); Effects.BasicFX.SetDirLights(_dirLights); Effects.BasicFX.SetEyePosW(_camera.Position); Effects.BasicFX.SetCubeMap(_sky.CubeMapSRV); Effects.NormalMapFX.SetDirLights(_dirLights); Effects.NormalMapFX.SetEyePosW(_camera.Position); Effects.NormalMapFX.SetCubeMap(_sky.CubeMapSRV); Effects.DisplacementMapFX.SetDirLights(_dirLights); Effects.DisplacementMapFX.SetEyePosW(_camera.Position); Effects.DisplacementMapFX.SetCubeMap(_sky.CubeMapSRV); Effects.DisplacementMapFX.SetHeightScale(0.05f); Effects.DisplacementMapFX.SetMaxTessDistance(1.0f); Effects.DisplacementMapFX.SetMinTessDistance(25.0f); Effects.DisplacementMapFX.SetMinTessFactor(1.0f); Effects.DisplacementMapFX.SetMaxTessFactor(5.0f); var activeTech = Effects.DisplacementMapFX.Light3Tech; var activeSphereTech = Effects.BasicFX.Light3ReflectTech; var activeSkullTech = Effects.BasicFX.Light3ReflectTech; switch (_renderOptions) { case RenderOptions.Basic: activeTech = Effects.BasicFX.Light3TexTech; ImmediateContext.InputAssembler.PrimitiveTopology = PrimitiveTopology.TriangleList; break; case RenderOptions.NormalMap: activeTech = Effects.NormalMapFX.Light3TexTech; ImmediateContext.InputAssembler.PrimitiveTopology = PrimitiveTopology.TriangleList; break; case RenderOptions.DisplacementMap: activeTech = Effects.DisplacementMapFX.Light3TexTech; ImmediateContext.InputAssembler.PrimitiveTopology = PrimitiveTopology.PatchListWith3ControlPoints; break; } var stride = PosNormalTexTan.Stride; var offset = 0; ImmediateContext.InputAssembler.InputLayout = InputLayouts.PosNormalTexTan; ImmediateContext.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(_shapesVB, stride, offset)); ImmediateContext.InputAssembler.SetIndexBuffer(_shapesIB, Format.R32_UInt, 0); if (Util.IsKeyDown(Keys.W)) { ImmediateContext.Rasterizer.State = RenderStates.WireframeRS; } for (int p = 0; p < activeTech.Description.PassCount; p++) { var world = _gridWorld; var wit = MathF.InverseTranspose(world); var wvp = world * viewProj; switch (_renderOptions) { case RenderOptions.Basic: Effects.BasicFX.SetWorld(world); Effects.BasicFX.SetWorldInvTranspose(wit); Effects.BasicFX.SetWorldViewProj(wvp); Effects.BasicFX.SetTexTransform(Matrix.Scaling(8, 10, 1)); Effects.BasicFX.SetMaterial(_gridMat); Effects.BasicFX.SetDiffuseMap(_stoneTexSRV); break; case RenderOptions.NormalMap: Effects.NormalMapFX.SetWorld(world); Effects.NormalMapFX.SetWorldInvTranspose(wit); Effects.NormalMapFX.SetWorldViewProj(wvp); Effects.NormalMapFX.SetTexTransform(Matrix.Scaling(8, 10, 1)); Effects.NormalMapFX.SetMaterial(_gridMat); Effects.NormalMapFX.SetDiffuseMap(_stoneTexSRV); Effects.NormalMapFX.SetNormalMap(_stoneNormalTexSRV); break; case RenderOptions.DisplacementMap: Effects.DisplacementMapFX.SetWorld(world); Effects.DisplacementMapFX.SetWorldInvTranspose(wit); Effects.DisplacementMapFX.SetViewProj(viewProj); Effects.DisplacementMapFX.SetWorldViewProj(wvp); Effects.DisplacementMapFX.SetTexTransform(Matrix.Scaling(8, 10, 1)); Effects.DisplacementMapFX.SetMaterial(_gridMat); Effects.DisplacementMapFX.SetDiffuseMap(_stoneTexSRV); Effects.DisplacementMapFX.SetNormalMap(_stoneNormalTexSRV); break; } var pass = activeTech.GetPassByIndex(p); pass.Apply(ImmediateContext); ImmediateContext.DrawIndexed(_gridIndexCount, _gridIndexOffset, _gridVertexOffset); world = _boxWorld; wit = MathF.InverseTranspose(world); wvp = world * viewProj; switch (_renderOptions) { case RenderOptions.Basic: Effects.BasicFX.SetWorld(world); Effects.BasicFX.SetWorldInvTranspose(wit); Effects.BasicFX.SetWorldViewProj(wvp); Effects.BasicFX.SetTexTransform(Matrix.Scaling(2, 1, 1)); Effects.BasicFX.SetMaterial(_boxMat); Effects.BasicFX.SetDiffuseMap(_brickTexSRV); break; case RenderOptions.NormalMap: Effects.NormalMapFX.SetWorld(world); Effects.NormalMapFX.SetWorldInvTranspose(wit); Effects.NormalMapFX.SetWorldViewProj(wvp); Effects.NormalMapFX.SetTexTransform(Matrix.Scaling(2, 1, 1)); Effects.NormalMapFX.SetMaterial(_boxMat); Effects.NormalMapFX.SetDiffuseMap(_brickTexSRV); Effects.NormalMapFX.SetNormalMap(_brickNormalTexSRV); break; case RenderOptions.DisplacementMap: Effects.DisplacementMapFX.SetWorld(world); Effects.DisplacementMapFX.SetWorldInvTranspose(wit); Effects.DisplacementMapFX.SetViewProj(viewProj); Effects.DisplacementMapFX.SetWorldViewProj(wvp); Effects.DisplacementMapFX.SetTexTransform(Matrix.Scaling(2, 1, 1)); Effects.DisplacementMapFX.SetMaterial(_boxMat); Effects.DisplacementMapFX.SetDiffuseMap(_brickTexSRV); Effects.DisplacementMapFX.SetNormalMap(_brickNormalTexSRV); break; } pass.Apply(ImmediateContext); ImmediateContext.DrawIndexed(_boxIndexCount, _boxIndexOffset, _boxVertexOffset); foreach (var matrix in _cylWorld) { world = matrix; wit = MathF.InverseTranspose(world); wvp = world * viewProj; switch (_renderOptions) { case RenderOptions.Basic: Effects.BasicFX.SetWorld(world); Effects.BasicFX.SetWorldInvTranspose(wit); Effects.BasicFX.SetWorldViewProj(wvp); Effects.BasicFX.SetTexTransform(Matrix.Scaling(1, 2, 1)); Effects.BasicFX.SetMaterial(_cylinderMat); Effects.BasicFX.SetDiffuseMap(_brickTexSRV); break; case RenderOptions.NormalMap: Effects.NormalMapFX.SetWorld(world); Effects.NormalMapFX.SetWorldInvTranspose(wit); Effects.NormalMapFX.SetWorldViewProj(wvp); Effects.NormalMapFX.SetTexTransform(Matrix.Scaling(1, 2, 1)); Effects.NormalMapFX.SetMaterial(_cylinderMat); Effects.NormalMapFX.SetDiffuseMap(_brickTexSRV); Effects.NormalMapFX.SetNormalMap(_brickNormalTexSRV); break; case RenderOptions.DisplacementMap: Effects.DisplacementMapFX.SetWorld(world); Effects.DisplacementMapFX.SetWorldInvTranspose(wit); Effects.DisplacementMapFX.SetViewProj(viewProj); Effects.DisplacementMapFX.SetWorldViewProj(wvp); Effects.DisplacementMapFX.SetTexTransform(Matrix.Scaling(1, 2, 1)); Effects.DisplacementMapFX.SetMaterial(_cylinderMat); Effects.DisplacementMapFX.SetDiffuseMap(_brickTexSRV); Effects.DisplacementMapFX.SetNormalMap(_brickNormalTexSRV); break; } pass.Apply(ImmediateContext); ImmediateContext.DrawIndexed(_cylinderIndexCount, _cylinderIndexOffset, _cylinderVertexOffset); } } ImmediateContext.HullShader.Set(null); ImmediateContext.DomainShader.Set(null); ImmediateContext.InputAssembler.PrimitiveTopology = PrimitiveTopology.TriangleList; for (int p = 0; p < activeSphereTech.Description.PassCount; p++) { foreach (var matrix in _sphereWorld) { var world = matrix; var wit = MathF.InverseTranspose(world); var wvp = world * viewProj; Effects.BasicFX.SetWorld(world); Effects.BasicFX.SetWorldInvTranspose(wit); Effects.BasicFX.SetWorldViewProj(wvp); Effects.BasicFX.SetTexTransform(Matrix.Identity); Effects.BasicFX.SetMaterial(_sphereMat); activeSphereTech.GetPassByIndex(p).Apply(ImmediateContext); ImmediateContext.DrawIndexed(_sphereIndexCount, _sphereIndexOffset, _sphereVertexOffset); } } stride = Basic32.Stride; offset = 0; ImmediateContext.Rasterizer.State = null; ImmediateContext.InputAssembler.InputLayout = InputLayouts.Basic32; ImmediateContext.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(_skullVB, stride, offset)); ImmediateContext.InputAssembler.SetIndexBuffer(_skullIB, Format.R32_UInt, 0); for (int p = 0; p < activeSkullTech.Description.PassCount; p++) { var world = _skullWorld; var wit = MathF.InverseTranspose(world); var wvp = world * viewProj; Effects.BasicFX.SetWorld(world); Effects.BasicFX.SetWorldInvTranspose(wit); Effects.BasicFX.SetWorldViewProj(wvp); Effects.BasicFX.SetMaterial(_skullMat); activeSkullTech.GetPassByIndex(p).Apply(ImmediateContext); ImmediateContext.DrawIndexed(_skullIndexCount, 0, 0); } _sky.Draw(ImmediateContext, _camera); ImmediateContext.Rasterizer.State = null; ImmediateContext.OutputMerger.DepthStencilState = null; ImmediateContext.OutputMerger.DepthStencilReference = 0; SwapChain.Present(0, PresentFlags.None); }
public override void DrawScene() { Effects.TerrainFX.SetSsaoMap(_whiteTex); Effects.TerrainFX.SetShadowMap(_sMap.DepthMapSRV); Effects.TerrainFX.SetShadowTransform(_shadowTransform); _minimap.RenderMinimap(_dirLights); var view = _lightView; var proj = _lightProj; var viewProj = view * proj; _terrain.Renderer.DrawToShadowMap(ImmediateContext, _sMap, viewProj); ImmediateContext.Rasterizer.State = null; ImmediateContext.ClearDepthStencilView(DepthStencilView, DepthStencilClearFlags.Depth | DepthStencilClearFlags.Stencil, 1.0f, 0); ImmediateContext.Rasterizer.SetViewports(Viewport); _terrain.Renderer.ComputeSsao(ImmediateContext, _camera, _ssao, DepthStencilView); ImmediateContext.OutputMerger.SetTargets(DepthStencilView, RenderTargetView); ImmediateContext.Rasterizer.SetViewports(Viewport); ImmediateContext.ClearRenderTargetView(RenderTargetView, Color.Silver); ImmediateContext.ClearDepthStencilView(DepthStencilView, DepthStencilClearFlags.Depth | DepthStencilClearFlags.Stencil, 1.0f, 0); if (Util.IsKeyDown(Keys.W)) { ImmediateContext.Rasterizer.State = RenderStates.WireframeRS; } if (Util.IsKeyDown(Keys.S)) { Effects.TerrainFX.SetSsaoMap(_whiteTex); } else { Effects.TerrainFX.SetSsaoMap(_ssao.AmbientSRV); } if (!Util.IsKeyDown(Keys.A)) { Effects.TerrainFX.SetShadowMap(_sMap.DepthMapSRV); Effects.TerrainFX.SetShadowTransform(_shadowTransform); } else { Effects.TerrainFX.SetShadowMap(_whiteTex); } Effects.BasicFX.SetEyePosW(_camera.Position); Effects.BasicFX.SetDirLights(_dirLights); Effects.BasicFX.SetSsaoMap(_whiteTex); Effects.BasicFX.SetSsaoMap(_whiteTex); if (_showSphere) { _sphere.World = Matrix.Translation(_spherePos); for (var p = 0; p < Effects.BasicFX.Light1Tech.Description.PassCount; p++) { var pass = Effects.BasicFX.Light1Tech.GetPassByIndex(p); _sphere.Draw(ImmediateContext, pass, _camera.View, _camera.Proj, RenderMode.Basic); } } _terrain.Renderer.Draw(ImmediateContext, _camera, _dirLights); ImmediateContext.Rasterizer.State = null; _sky.Draw(ImmediateContext, _camera); ImmediateContext.Rasterizer.State = null; ImmediateContext.OutputMerger.DepthStencilState = null; ImmediateContext.OutputMerger.DepthStencilReference = 0; _minimap.Draw(ImmediateContext); SwapChain.Present(0, PresentFlags.None); }