private void Draw() { int ticks = Environment.TickCount; _cl.Begin(); _cl.UpdateBuffer(_projectionBuffer, 0, Matrix4x4.CreatePerspectiveFieldOfView( 1.0f, (float)_window.Width / _window.Height, 0.5f, 100f)); _cl.UpdateBuffer(_viewBuffer, 0, Matrix4x4.CreateLookAt(Vector3.UnitZ * 2.5f, Vector3.Zero, Vector3.UnitY)); Matrix4x4 rotation = Matrix4x4.CreateFromAxisAngle(Vector3.UnitY, (ticks / 1000f)) * Matrix4x4.CreateFromAxisAngle(Vector3.UnitX, (ticks / 3000f)); _cl.UpdateBuffer(_worldBuffer, 0, ref rotation); _cl.SetFramebuffer(_gd.SwapchainFramebuffer); _cl.SetFullViewports(); _cl.ClearColorTarget(0, RgbaFloat.Black); _cl.ClearDepthTarget(1f); _cl.SetPipeline(_pipeline); _cl.SetVertexBuffer(0, _vertexBuffer); _cl.SetIndexBuffer(_indexBuffer, IndexFormat.UInt16); _cl.SetGraphicsResourceSet(0, _projViewSet); _cl.SetGraphicsResourceSet(1, _worldTextureSet); _cl.DrawIndexed(36, 1, 0, 0, 0); _cl.End(); _gd.ExecuteCommands(_cl); _gd.SwapBuffers(); }
private static void Draw() { // Begin() must be called before commands can be issued. _commandList.Begin(); // We want to render directly to the output window. _commandList.SetFramebuffer(_graphicsDevice.SwapchainFramebuffer); _commandList.SetFullViewports(); _commandList.ClearColorTarget(0, RgbaFloat.Black); _commandList.ClearDepthTarget(1); // Set all relevant state to draw our quad. _commandList.SetVertexBuffer(0, _vertexBuffer); _commandList.SetIndexBuffer(_indexBuffer, IndexFormat.UInt16); _commandList.SetPipeline(_pipeline); // Issue a Draw command for a single instance with 4 indices. _commandList.DrawIndexed( indexCount: 4, instanceCount: 1, indexStart: 0, vertexOffset: 0, instanceStart: 0); // End() must be called before commands can be submitted for execution. _commandList.End(); _graphicsDevice.ExecuteCommands(_commandList); // Once commands have been submitted, the rendered image can be presented to the application window. _graphicsDevice.SwapBuffers(); }
private void RenderAllSingleThread(GraphicsDevice gd, CommandList cl, SceneContext sc) { Matrix4x4 cameraProj = Camera.ProjectionMatrix; Vector4 nearLimitCS = Vector4.Transform(new Vector3(0, 0, -_nearCascadeLimit), cameraProj); Vector4 midLimitCS = Vector4.Transform(new Vector3(0, 0, -_midCascadeLimit), cameraProj); Vector4 farLimitCS = Vector4.Transform(new Vector3(0, 0, -_farCascadeLimit), cameraProj); cl.UpdateBuffer(sc.DepthLimitsBuffer, 0, new DepthCascadeLimits { NearLimit = nearLimitCS.Z, MidLimit = midLimitCS.Z, FarLimit = farLimitCS.Z }); cl.UpdateBuffer(sc.LightInfoBuffer, 0, sc.DirectionalLight.GetInfo()); // Near Matrix4x4 viewProj0 = UpdateDirectionalLightMatrices( sc, Camera.NearDistance, _nearCascadeLimit, sc.NearShadowMapTexture.Width, out BoundingFrustum lightFrustum); cl.UpdateBuffer(sc.LightViewProjectionBuffer0, 0, ref viewProj0); cl.SetFramebuffer(sc.NearShadowMapFramebuffer); cl.SetViewport(0, new Viewport(0, 0, sc.NearShadowMapTexture.Width, sc.NearShadowMapTexture.Height, 0, 1)); cl.SetScissorRect(0, 0, 0, sc.NearShadowMapTexture.Width, sc.NearShadowMapTexture.Height); cl.ClearDepthTarget(01f); Render(gd, cl, sc, RenderPasses.ShadowMapNear, lightFrustum, _renderQueues[0], _cullableStage[0], _renderableStage[0], null, false); // Mid Matrix4x4 viewProj1 = UpdateDirectionalLightMatrices( sc, _nearCascadeLimit, _midCascadeLimit, sc.MidShadowMapTexture.Width, out lightFrustum); cl.UpdateBuffer(sc.LightViewProjectionBuffer1, 0, ref viewProj1); cl.SetFramebuffer(sc.MidShadowMapFramebuffer); cl.SetViewport(0, new Viewport(0, 0, sc.MidShadowMapTexture.Width, sc.MidShadowMapTexture.Height, 0, 1)); cl.SetScissorRect(0, 0, 0, sc.MidShadowMapTexture.Width, sc.MidShadowMapTexture.Height); cl.ClearDepthTarget(1f); Render(gd, cl, sc, RenderPasses.ShadowMapMid, lightFrustum, _renderQueues[0], _cullableStage[0], _renderableStage[0], null, false); // Far Matrix4x4 viewProj2 = UpdateDirectionalLightMatrices( sc, _midCascadeLimit, _farCascadeLimit, sc.FarShadowMapTexture.Width, out lightFrustum); cl.UpdateBuffer(sc.LightViewProjectionBuffer2, 0, ref viewProj2); cl.SetFramebuffer(sc.FarShadowMapFramebuffer); cl.SetViewport(0, new Viewport(0, 0, sc.FarShadowMapTexture.Width, sc.FarShadowMapTexture.Height, 0, 1)); cl.SetScissorRect(0, 0, 0, sc.FarShadowMapTexture.Width, sc.FarShadowMapTexture.Height); cl.ClearDepthTarget(1f); Render(gd, cl, sc, RenderPasses.ShadowMapFar, lightFrustum, _renderQueues[0], _cullableStage[0], _renderableStage[0], null, false); cl.SetFramebuffer(gd.SwapchainFramebuffer); float scWidth = gd.SwapchainFramebuffer.Width; float scHeight = gd.SwapchainFramebuffer.Height; cl.SetViewport(0, new Viewport(0, 0, scWidth, scHeight, 0, 1)); cl.SetScissorRect(0, 0, 0, (uint)scWidth, (uint)scHeight); cl.ClearColorTarget(0, RgbaFloat.CornflowerBlue); cl.ClearDepthTarget(1f); BoundingFrustum cameraFrustum = new BoundingFrustum(_camera.ViewMatrix * _camera.ProjectionMatrix); Render(gd, cl, sc, RenderPasses.Standard, cameraFrustum, _renderQueues[0], _cullableStage[0], _renderableStage[0], null, false); Render(gd, cl, sc, RenderPasses.AlphaBlend, cameraFrustum, _renderQueues[0], _cullableStage[0], _renderableStage[0], null, false); Render(gd, cl, sc, RenderPasses.Overlay, cameraFrustum, _renderQueues[0], _cullableStage[0], _renderableStage[0], null, false); _resourceUpdateCL.Begin(); foreach (Renderable renderable in _allPerFrameRenderablesSet) { renderable.UpdatePerFrameResources(gd, _resourceUpdateCL, sc); } _resourceUpdateCL.End(); gd.ExecuteCommands(_resourceUpdateCL); }