// Example using async protected override void CreateDeviceDependentResources(Common.DeviceManager deviceManager) { base.CreateDeviceDependentResources(deviceManager); RemoveAndDispose(ref fpsRenderer); RemoveAndDispose(ref cubeRenderer); RemoveAndDispose(ref textRenderer); RemoveAndDispose(ref vertexShader); RemoveAndDispose(ref vertexLayout); RemoveAndDispose(ref pixelShader); var device = deviceManager.Direct3DDevice; #region Compile shaders // Compile Vertex Shader and create vertex InputLayout using (var bytecode = HLSLCompiler.CompileFromFile(@"Shaders\VS.hlsl", "VSMain", "vs_5_0")) { vertexShader = new VertexShader(device, bytecode); vertexLayout = ToDispose(new InputLayout(device, bytecode.GetPart(ShaderBytecodePart.InputSignatureBlob).Data, new[] { // "SV_Position" = vertex coordinate in object space new InputElement("SV_Position", 0, Format.R32G32B32_Float, 0, 0), // "NORMAL" = the vertex normal new InputElement("NORMAL", 0, Format.R32G32B32_Float, 12, 0), // "COLOR" new InputElement("COLOR", 0, Format.R8G8B8A8_UNorm, 24, 0), // "UV" new InputElement("TEXCOORD", 0, Format.R32G32_Float, 28, 0), // "BLENDINDICES" new InputElement("BLENDINDICES", 0, Format.R32G32B32A32_UInt, 36, 0), // "BLENDWEIGHT" new InputElement("BLENDWEIGHT", 0, Format.R32G32B32A32_Float, 52, 0), })); } // Compile pixel shader using (var bytecode = HLSLCompiler.CompileFromFile(@"Shaders\SimplePS.hlsl", "PSMain", "ps_5_0")) pixelShader = ToDispose(new PixelShader(device, bytecode)); #endregion #region Create constant buffers // Create constant buffers // Create the constant buffer that will // store our worldViewProjection matrix perObjectBuffer = ToDispose(new SharpDX.Direct3D11.Buffer(device, Utilities.SizeOf<ConstantBuffers.PerObject>(), ResourceUsage.Default, BindFlags.ConstantBuffer, CpuAccessFlags.None, ResourceOptionFlags.None, 0)); // Create the per frame constant buffer // lighting / camera position perFrameBuffer = ToDispose(new Buffer(device, Utilities.SizeOf<ConstantBuffers.PerFrame>(), ResourceUsage.Default, BindFlags.ConstantBuffer, CpuAccessFlags.None, ResourceOptionFlags.None, 0)); // Create the per material constant buffer perMaterialBuffer = ToDispose(new Buffer(device, Utilities.SizeOf<ConstantBuffers.PerMaterial>(), ResourceUsage.Default, BindFlags.ConstantBuffer, CpuAccessFlags.None, ResourceOptionFlags.None, 0)); // Create the per armature/skeletong constant buffer perArmatureBuffer = ToDispose(new Buffer(device, ConstantBuffers.PerArmature.Size(), ResourceUsage.Default, BindFlags.ConstantBuffer, CpuAccessFlags.None, ResourceOptionFlags.None, 0)); #endregion #region Create pipeline state variables // Configure the depth buffer to discard pixels that are // further than the current pixel. depthStencilState = ToDispose(new DepthStencilState(device, new DepthStencilStateDescription() { IsDepthEnabled = true, // enable depth? DepthComparison = Comparison.Less, DepthWriteMask = SharpDX.Direct3D11.DepthWriteMask.All, IsStencilEnabled = false,// enable stencil? StencilReadMask = 0xff, // 0xff (no mask) StencilWriteMask = 0xff,// 0xff (no mask) })); rsCullBack = ToDispose(new RasterizerState(device, new RasterizerStateDescription { CullMode = CullMode.Back, IsFrontCounterClockwise = false, FillMode = FillMode.Solid, })); #endregion #region Create Renderers cubeRenderer = new CubeRenderer(); cubeRenderer.Initialize(this); textRenderer = ToDispose(new TextRenderer("Calibri", SharpDX.Color.Black, new Point(20, 100), 48, 800)); textRenderer.Initialize(this); fpsRenderer = ToDispose(new FpsRenderer()); fpsRenderer.Initialize(this); #endregion clock.Start(); }
// Example using async protected async override void CreateDeviceDependentResources(Common.DeviceManager deviceManager) { ResourcesLoaded = false; base.CreateDeviceDependentResources(deviceManager); RemoveAndDispose(ref fpsRenderer); RemoveAndDispose(ref textRenderer); RemoveAndDispose(ref vertexShader); RemoveAndDispose(ref vertexLayout); RemoveAndDispose(ref pixelShader); foreach (var m in meshRenderers) { var m2 = m; RemoveAndDispose(ref m2); } meshRenderers.Clear(); var device = deviceManager.Direct3DDevice; #region Compile shaders // Compile Vertex Shader and create vertex InputLayout using (var bytecode = await HLSLCompiler.CompileFromFileAsync(@"Shaders\VS.hlsl", "VSMain", "vs_5_0")) { vertexShader = new VertexShader(device, bytecode); vertexLayout = ToDispose(new InputLayout(device, bytecode.GetPart(ShaderBytecodePart.InputSignatureBlob).Data, new[] { // "SV_Position" = vertex coordinate in object space new InputElement("SV_Position", 0, Format.R32G32B32_Float, 0, 0), // "NORMAL" = the vertex normal new InputElement("NORMAL", 0, Format.R32G32B32_Float, 12, 0), // "COLOR" new InputElement("COLOR", 0, Format.R8G8B8A8_UNorm, 24, 0), // "UV" new InputElement("TEXCOORD", 0, Format.R32G32_Float, 28, 0), // "BLENDINDICES" new InputElement("BLENDINDICES", 0, Format.R32G32B32A32_UInt, 36, 0), // "BLENDWEIGHT" new InputElement("BLENDWEIGHT", 0, Format.R32G32B32A32_Float, 52, 0), })); } // Compile pixel shader using (var bytecode = await HLSLCompiler.CompileFromFileAsync(@"Shaders\BlinnPhongPS.hlsl", "PSMain", "ps_5_0")) pixelShader = ToDispose(new PixelShader(device, bytecode)); #endregion #region Create constant buffers // Create constant buffers // Create the constant buffer that will // store our worldViewProjection matrix perObjectBuffer = ToDispose(new SharpDX.Direct3D11.Buffer(device, Utilities.SizeOf <ConstantBuffers.PerObject>(), ResourceUsage.Default, BindFlags.ConstantBuffer, CpuAccessFlags.None, ResourceOptionFlags.None, 0)); // Create the per frame constant buffer // lighting / camera position perFrameBuffer = ToDispose(new Buffer(device, Utilities.SizeOf <ConstantBuffers.PerFrame>(), ResourceUsage.Default, BindFlags.ConstantBuffer, CpuAccessFlags.None, ResourceOptionFlags.None, 0)); // Create the per material constant buffer perMaterialBuffer = ToDispose(new Buffer(device, Utilities.SizeOf <ConstantBuffers.PerMaterial>(), ResourceUsage.Default, BindFlags.ConstantBuffer, CpuAccessFlags.None, ResourceOptionFlags.None, 0)); // Create the per armature/skeletong constant buffer perArmatureBuffer = ToDispose(new Buffer(device, ConstantBuffers.PerArmature.Size(), ResourceUsage.Default, BindFlags.ConstantBuffer, CpuAccessFlags.None, ResourceOptionFlags.None, 0)); #endregion #region Create pipeline state variables // Configure the depth buffer to discard pixels that are // further than the current pixel. depthStencilState = ToDispose(new DepthStencilState(device, new DepthStencilStateDescription() { IsDepthEnabled = true, // enable depth? DepthComparison = Comparison.Less, DepthWriteMask = SharpDX.Direct3D11.DepthWriteMask.All, IsStencilEnabled = false, // enable stencil? StencilReadMask = 0xff, // 0xff (no mask) StencilWriteMask = 0xff, // 0xff (no mask) })); rsCullBack = ToDispose(new RasterizerState(device, new RasterizerStateDescription { CullMode = CullMode.Back, IsFrontCounterClockwise = false, FillMode = FillMode.Solid, })); #endregion #region Create Renderers var meshes = await Mesh.LoadFromFileAsync("Character.cmo"); meshRenderers.AddRange((from mesh in meshes select ToDispose(new MeshRenderer(mesh)))); await Task.Run(() => { foreach (var m in meshRenderers) { m.Initialize(this); m.PerArmatureBuffer = perArmatureBuffer; m.PerMaterialBuffer = perMaterialBuffer; if (m.Mesh.Animations != null && m.Mesh.Animations.Any()) { m.CurrentAnimation = m.Mesh.Animations.First().Value; } m.Clock.Start(); } }); textRenderer = ToDispose(new TextRenderer("Calibri", SharpDX.Color.Black, new Point(20, 100), 48, 800)); textRenderer.Initialize(this); fpsRenderer = ToDispose(new FpsRenderer("Calibri", SharpDX.Color.CornflowerBlue, new Point(20, 20), 16)); fpsRenderer.Initialize(this); #endregion clock.Start(); ResourcesLoaded = true; }
public override void Run() { // Create and Initialize the axis lines renderer var axisLines = ToDispose(new AxisLinesRenderer()); axisLines.Initialize(this); // Create and Initialize the axis lines renderer var triangle = ToDispose(new TriangleRenderer()); triangle.Initialize(this); //// Create and Initialize the axis lines renderer var quad = ToDispose(new QuadRenderer()); quad.Initialize(this); //// Create and Initialize the axis lines renderer var sphere = ToDispose(new SphereRenderer(Vector3.Zero, .25f)); sphere.Initialize(this); //// FPS renderer FpsRenderer fps = null; if (ShowFPS) { fps = ToDispose(new Common.FpsRenderer("Calibri", Color.CornflowerBlue, new Point(8, 8), 16)); fps.Initialize(this); } //// Text renderer Common.TextRenderer textRenderer = null; if (ShowText) { textRenderer = ToDispose(new Common.TextRenderer("Calibri", Color.CornflowerBlue, new Point(8, 30), 12)); textRenderer.Initialize(this); UpdateText = () => { textRenderer.Text = String.Format("World rotation ({0}) (Up/Down Left/Right Wheel+-)\nView ({1}) (A/D, W/S, Shift+Wheel+-)" + "\nPress X to reinitialize the device and resources (device ptr: {2})" + "\nPress Z to show/hide depth buffer", rotation, V.TranslationVector, DeviceManager.Direct3DDevice.NativePointer); }; UpdateText(); } InitializeMatricies(); Window.Resize += Window_Resize; Window.KeyDown += Window_KeyDown; Window.KeyUp += Window_KeyUp; Window.MouseWheel += Window_MouseWheel; RenderLoop.Run(Window, () => { // Clear DSV DeviceManager.Direct3DContext.ClearDepthStencilView(DepthStencilView, DepthStencilClearFlags.Depth | DepthStencilClearFlags.Stencil, 1.0f, 0); // Clear RTV DeviceManager.Direct3DContext.ClearRenderTargetView(RenderTargetView, Color.White); // VP matrix var VP = Matrix.Multiply(V, P); // MVP var MVP = M * VP; // Must transpose to use in HLSL MVP.Transpose(); // Write MVP to constant buffer DeviceManager.Direct3DContext.UpdateSubresource(ref MVP, mvpBuffer); // Render our primitives axisLines.Render(); quad.Render(); MVP = sphere.M * VP; MVP.Transpose(); DeviceManager.Direct3DContext.UpdateSubresource(ref MVP, mvpBuffer); sphere.Render(); var v = sphere.RotationAngles; v.Y += 0.016f; sphere.RotationAngles = v; triangle.Render(); // FPS renderer if (fps != null) { fps.Render(); } // Text renderer if (textRenderer != null) { textRenderer.Render(); } Present(); }); }