public Device() { // Default background color backgroundColor = new SlimDX.Color4(0.5f, 0.5f, 1.0f); form = new SlimDX.Windows.RenderForm() { Text = "Game", WindowState = System.Windows.Forms.FormWindowState.Maximized }; swapChainDescription = new SlimDX.DXGI.SwapChainDescription() { BufferCount = 1, Usage = SlimDX.DXGI.Usage.RenderTargetOutput, OutputHandle = form.Handle, IsWindowed = true, ModeDescription = new SlimDX.DXGI.ModeDescription(form.ClientSize.Width, form.ClientSize.Height, new SlimDX.Rational(60, 1), SlimDX.DXGI.Format.R8G8B8A8_UNorm), SampleDescription = new SlimDX.DXGI.SampleDescription(1, 0), Flags = SlimDX.DXGI.SwapChainFlags.AllowModeSwitch, SwapEffect = SlimDX.DXGI.SwapEffect.Discard }; var result = SlimDX.Direct3D11.Device.CreateWithSwapChain(SlimDX.Direct3D11.DriverType.Hardware, SlimDX.Direct3D11.DeviceCreationFlags.SingleThreaded, swapChainDescription, out device, out swapChain); if (result.IsFailure) { throw new ApplicationException("Failed to initialize DirectX 11."); } deviceContext = device.ImmediateContext; using (var resource = SlimDX.Direct3D11.Resource.FromSwapChain<SlimDX.Direct3D11.Texture2D>(swapChain, 0)) { screenRenderTargetView = new SlimDX.Direct3D11.RenderTargetView(device, resource); } using (var factory = swapChain.GetParent<SlimDX.DXGI.Factory>()) { result = factory.SetWindowAssociation(form.Handle, SlimDX.DXGI.WindowAssociationFlags.IgnoreAltEnter); if (result.IsFailure) { throw new ApplicationException("Failed to associate window with DirectX device."); } } viewport = new SlimDX.Direct3D11.Viewport(0.0f, 0.0f, Convert.ToSingle(form.ClientSize.Width), Convert.ToSingle(form.ClientSize.Height)); deviceContext.Rasterizer.SetViewports(viewport); form.KeyDown += (sender, e) => { if (e.Alt && e.KeyCode == System.Windows.Forms.Keys.Enter) { swapChain.IsFullScreen = !swapChain.IsFullScreen; } }; form.UserResized += (sender, e) => { var resizeResult = swapChain.ResizeBuffers(2, 0, 0, SlimDX.DXGI.Format.R8G8B8A8_UNorm, SlimDX.DXGI.SwapChainFlags.AllowModeSwitch); if (resizeResult.IsSuccess) { using (var resource = SlimDX.Direct3D11.Resource.FromSwapChain<SlimDX.Direct3D11.Texture2D>(swapChain, 0)) { screenRenderTargetView.Dispose(); screenRenderTargetView = new SlimDX.Direct3D11.RenderTargetView(device, resource); } viewport = new SlimDX.Direct3D11.Viewport(0.0f, 0.0f, Convert.ToSingle(form.ClientSize.Width), Convert.ToSingle(form.ClientSize.Height)); deviceContext.Rasterizer.SetViewports(viewport); } }; }
public override void Create(IntPtr handle) { var desc = new SlimDX.DXGI.SwapChainDescription() { BufferCount = 1, ModeDescription = new SlimDX.DXGI.ModeDescription(View.ClientSize.Width, View.ClientSize.Height, new Rational(60, 1), SlimDX.DXGI.Format.R8G8B8A8_UNorm), IsWindowed = true, OutputHandle = handle, SampleDescription = new SlimDX.DXGI.SampleDescription(1, 0), SwapEffect = SlimDX.DXGI.SwapEffect.Discard, Usage = SlimDX.DXGI.Usage.RenderTargetOutput, Flags = SlimDX.DXGI.SwapChainFlags.AllowModeSwitch }; SlimDX.Direct3D10.Device.CreateWithSwapChain(null, SlimDX.Direct3D10.DriverType.Hardware, SlimDX.Direct3D10.DeviceCreationFlags.Debug, desc, out Device10, out SwapChain); backBuffer = SlimDX.Direct3D10.Texture2D.FromSwapChain<SlimDX.Direct3D10.Texture2D>(SwapChain, 0); RenderView = new SlimDX.Direct3D10.RenderTargetView(Device10, backBuffer); SlimDX.Direct3D10.Texture2DDescription depthStencilDesc = new SlimDX.Direct3D10.Texture2DDescription { Width = View.Width, Height = View.Height, MipLevels = 1, ArraySize = 1, Format = SlimDX.DXGI.Format.D32_Float, SampleDescription = new SlimDX.DXGI.SampleDescription(1, 0), Usage = SlimDX.Direct3D10.ResourceUsage.Default, BindFlags = SlimDX.Direct3D10.BindFlags.DepthStencil, CpuAccessFlags = SlimDX.Direct3D10.CpuAccessFlags.None, OptionFlags = SlimDX.Direct3D10.ResourceOptionFlags.None }; depthStencil = new SlimDX.Direct3D10.Texture2D(Device10, depthStencilDesc); DepthStencilView = new SlimDX.Direct3D10.DepthStencilView(Device10, depthStencil, new SlimDX.Direct3D10.DepthStencilViewDescription { Format = SlimDX.DXGI.Format.D32_Float, FirstArraySlice = 0, ArraySize = 1, MipSlice = 0, Dimension = SlimDX.Direct3D10.DepthStencilViewDimension.Texture2D }); SlimDX.Direct3D10.DepthStencilStateDescription dssd = new SlimDX.Direct3D10.DepthStencilStateDescription { IsDepthEnabled = true, DepthWriteMask = SlimDX.Direct3D10.DepthWriteMask.All, DepthComparison = SlimDX.Direct3D10.Comparison.Less, IsStencilEnabled = true, StencilReadMask = 0xFF, StencilWriteMask = 0xFF, FrontFace = new SlimDX.Direct3D10.DepthStencilOperationDescription { FailOperation = SlimDX.Direct3D10.StencilOperation.Keep, DepthFailOperation = SlimDX.Direct3D10.StencilOperation.Increment, PassOperation = SlimDX.Direct3D10.StencilOperation.Keep, Comparison = SlimDX.Direct3D10.Comparison.Always }, BackFace = new SlimDX.Direct3D10.DepthStencilOperationDescription { FailOperation = SlimDX.Direct3D10.StencilOperation.Keep, DepthFailOperation = SlimDX.Direct3D10.StencilOperation.Decrement, PassOperation = SlimDX.Direct3D10.StencilOperation.Keep, Comparison = SlimDX.Direct3D10.Comparison.Always } }; depthStencilState = SlimDX.Direct3D10.DepthStencilState.FromDescription(Device10, dssd); Device10.OutputMerger.DepthStencilState = depthStencilState; Device10.OutputMerger.SetTargets(DepthStencilView, RenderView); Viewport10 = new SlimDX.Direct3D10.Viewport(0, 0, View.ClientSize.Width, View.ClientSize.Height, 0.0f, 1.0f); Device10.Rasterizer.SetViewports(Viewport10); //Stops Alt+enter from causing fullscreen skrewiness. factory = SwapChain.GetParent<SlimDX.DXGI.Factory>(); factory.SetWindowAssociation(View.Handle, SlimDX.DXGI.WindowAssociationFlags.IgnoreAll); }
public override void Create(IntPtr handle) { var desc = new SlimDX.DXGI.SwapChainDescription() { BufferCount = 1, ModeDescription = new SlimDX.DXGI.ModeDescription(View.ClientSize.Width, View.ClientSize.Height, new Rational(60, 1), SlimDX.DXGI.Format.R8G8B8A8_UNorm), IsWindowed = true, OutputHandle = handle, SampleDescription = new SlimDX.DXGI.SampleDescription(1, 0), SwapEffect = SlimDX.DXGI.SwapEffect.Discard, Usage = SlimDX.DXGI.Usage.RenderTargetOutput, Flags = SlimDX.DXGI.SwapChainFlags.AllowModeSwitch }; SlimDX.Direct3D10.Device.CreateWithSwapChain(null, SlimDX.Direct3D10.DriverType.Hardware, SlimDX.Direct3D10.DeviceCreationFlags.Debug, desc, out Device10, out SwapChain); backBuffer = SlimDX.Direct3D10.Texture2D.FromSwapChain <SlimDX.Direct3D10.Texture2D>(SwapChain, 0); RenderView = new SlimDX.Direct3D10.RenderTargetView(Device10, backBuffer); SlimDX.Direct3D10.Texture2DDescription depthStencilDesc = new SlimDX.Direct3D10.Texture2DDescription { Width = View.Width, Height = View.Height, MipLevels = 1, ArraySize = 1, Format = SlimDX.DXGI.Format.D32_Float, SampleDescription = new SlimDX.DXGI.SampleDescription(1, 0), Usage = SlimDX.Direct3D10.ResourceUsage.Default, BindFlags = SlimDX.Direct3D10.BindFlags.DepthStencil, CpuAccessFlags = SlimDX.Direct3D10.CpuAccessFlags.None, OptionFlags = SlimDX.Direct3D10.ResourceOptionFlags.None }; depthStencil = new SlimDX.Direct3D10.Texture2D(Device10, depthStencilDesc); DepthStencilView = new SlimDX.Direct3D10.DepthStencilView(Device10, depthStencil, new SlimDX.Direct3D10.DepthStencilViewDescription { Format = SlimDX.DXGI.Format.D32_Float, FirstArraySlice = 0, ArraySize = 1, MipSlice = 0, Dimension = SlimDX.Direct3D10.DepthStencilViewDimension.Texture2D }); SlimDX.Direct3D10.DepthStencilStateDescription dssd = new SlimDX.Direct3D10.DepthStencilStateDescription { IsDepthEnabled = true, DepthWriteMask = SlimDX.Direct3D10.DepthWriteMask.All, DepthComparison = SlimDX.Direct3D10.Comparison.Less, IsStencilEnabled = true, StencilReadMask = 0xFF, StencilWriteMask = 0xFF, FrontFace = new SlimDX.Direct3D10.DepthStencilOperationDescription { FailOperation = SlimDX.Direct3D10.StencilOperation.Keep, DepthFailOperation = SlimDX.Direct3D10.StencilOperation.Increment, PassOperation = SlimDX.Direct3D10.StencilOperation.Keep, Comparison = SlimDX.Direct3D10.Comparison.Always }, BackFace = new SlimDX.Direct3D10.DepthStencilOperationDescription { FailOperation = SlimDX.Direct3D10.StencilOperation.Keep, DepthFailOperation = SlimDX.Direct3D10.StencilOperation.Decrement, PassOperation = SlimDX.Direct3D10.StencilOperation.Keep, Comparison = SlimDX.Direct3D10.Comparison.Always } }; depthStencilState = SlimDX.Direct3D10.DepthStencilState.FromDescription(Device10, dssd); Device10.OutputMerger.DepthStencilState = depthStencilState; Device10.OutputMerger.SetTargets(DepthStencilView, RenderView); Viewport10 = new SlimDX.Direct3D10.Viewport(0, 0, View.ClientSize.Width, View.ClientSize.Height, 0.0f, 1.0f); Device10.Rasterizer.SetViewports(Viewport10); //Stops Alt+enter from causing fullscreen skrewiness. factory = SwapChain.GetParent <SlimDX.DXGI.Factory>(); factory.SetWindowAssociation(View.Handle, SlimDX.DXGI.WindowAssociationFlags.IgnoreAll); }
static Result InitDevice() { //int width = form.ClientSize.Width; //int height = form.ClientSize.Height; int width = 2500; int height = 1000; SlimDX.DXGI.SwapChainDescription swapChainDesc = new SlimDX.DXGI.SwapChainDescription() { BufferCount = 1, ModeDescription = new SlimDX.DXGI.ModeDescription() { Width = width, Height = height, Format = SlimDX.DXGI.Format.B8G8R8A8_UNorm, RefreshRate = new Rational(60, 1), }, Usage = SlimDX.DXGI.Usage.RenderTargetOutput, OutputHandle = form.Handle, SampleDescription = new SlimDX.DXGI.SampleDescription { Count = 1, Quality = 0 }, IsWindowed = true, }; Device.CreateWithSwapChain(DriverType.Hardware, DeviceCreationFlags.None, new FeatureLevel[] { FeatureLevel.Level_11_0 }, swapChainDesc, out _Device, out _SwapChain); if (Result.Last.IsFailure) { return(Result.Last); } // Create a render target view Texture2D backBuffer = Resource.FromSwapChain <Texture2D>(_SwapChain, 0); _ViewRenderTarget = new RenderTargetView(_Device, backBuffer); backBuffer.Dispose(); if (Result.Last.IsFailure) { return(Result.Last); } _Device.ImmediateContext.OutputMerger.SetTargets(_ViewRenderTarget); // Setup the viewport Viewport vp = new Viewport { Width = width, Height = height, MinZ = 0.0f, MaxZ = 1.0f, X = 0, Y = 0, }; _Device.ImmediateContext.Rasterizer.SetViewports(vp); // Compile the vertex shader ShaderBytecode vertexShaderCode = ShaderBytecode.CompileFromFile("haha.fx", "VS", "vs_4_0", ShaderFlags.EnableStrictness | ShaderFlags.Debug, EffectFlags.None); if (Result.Last.IsFailure) { return(Result.Last); } // Create the vertex shader _VertexShader = new VertexShader(_Device, vertexShaderCode); if (Result.Last.IsFailure) { return(Result.Last); } // Define the input layout InputElement[] inputElements = new InputElement[2] { new InputElement("POSITION", 0, SlimDX.DXGI.Format.R32G32B32_Float, 0, 0, InputClassification.PerVertexData, 0), new InputElement("TEXCOORD", 0, SlimDX.DXGI.Format.R32G32_Float, 12, 0, InputClassification.PerVertexData, 0), }; _LayOut = new InputLayout(_Device, vertexShaderCode, inputElements); vertexShaderCode.Dispose(); if (Result.Last.IsFailure) { return(Result.Last); } // Set the input layout _Device.ImmediateContext.InputAssembler.InputLayout = _LayOut; // Compile the pixel shader ShaderBytecode pixelShaderCode = ShaderBytecode.CompileFromFile("haha.fx", "PS", "ps_4_0", ShaderFlags.EnableStrictness | ShaderFlags.Debug, EffectFlags.None); if (Result.Last.IsFailure) { return(Result.Last); } // Create the pixel shader _PixelShader = new PixelShader(_Device, pixelShaderCode); pixelShaderCode.Dispose(); if (Result.Last.IsFailure) { return(Result.Last); } // Create vertex buffer CustomVertex[] vertices = new CustomVertex[] { new CustomVertex() { Pos = new Vector3(-1.0f, 1.0f, 0.0f), Tex = new Vector2(0.0f, 0.0f) }, // top left new CustomVertex() { Pos = new Vector3(0.0f, 1.0f, 0.0f), Tex = new Vector2(1.0f, 0.0f) }, // top right new CustomVertex() { Pos = new Vector3(-1.0f, 0.0f, 0.0f), Tex = new Vector2(0.0f, 1.0f) }, // lower left new CustomVertex() { Pos = new Vector3(0.0f, 0.0f, 0.0f), Tex = new Vector2(1.0f, 1.0f) }, // lower right new CustomVertex() { Pos = new Vector3(0.0f, 1.0f, 0.0f), Tex = new Vector2(0.0f, 0.0f) }, // top left new CustomVertex() { Pos = new Vector3(1.0f, 1.0f, 0.0f), Tex = new Vector2(1.0f, 0.0f) }, // top right new CustomVertex() { Pos = new Vector3(0.0f, 0.0f, 0.0f), Tex = new Vector2(0.0f, 1.0f) }, // lower left new CustomVertex() { Pos = new Vector3(1.0f, 0.0f, 0.0f), Tex = new Vector2(1.0f, 1.0f) }, // lower right new CustomVertex() { Pos = new Vector3(-1.0f, 0.0f, 0.0f), Tex = new Vector2(0.0f, 0.0f) }, // top left new CustomVertex() { Pos = new Vector3(0.0f, 0.0f, 0.0f), Tex = new Vector2(1.0f, 0.0f) }, // top right new CustomVertex() { Pos = new Vector3(-1.0f, -1.0f, 0.0f), Tex = new Vector2(0.0f, 1.0f) }, // lower left new CustomVertex() { Pos = new Vector3(0.0f, -1.0f, 0.0f), Tex = new Vector2(1.0f, 1.0f) }, // lower right new CustomVertex() { Pos = new Vector3(0.0f, 0.0f, 0.0f), Tex = new Vector2(0.0f, 0.0f) }, // top left new CustomVertex() { Pos = new Vector3(1.0f, 0.0f, 0.0f), Tex = new Vector2(1.0f, 0.0f) }, // top right new CustomVertex() { Pos = new Vector3(0.0f, -1.0f, 0.0f), Tex = new Vector2(0.0f, 1.0f) }, // lower left new CustomVertex() { Pos = new Vector3(1.0f, -1.0f, 0.0f), Tex = new Vector2(1.0f, 1.0f) }, // lower right }; DataStream vertexData = new DataStream(vertices, true, false); int stride = System.Runtime.InteropServices.Marshal.SizeOf(vertices[0]); BufferDescription bufferDesc = new BufferDescription { Usage = ResourceUsage.Default, SizeInBytes = vertices.Length * stride, BindFlags = BindFlags.VertexBuffer, CpuAccessFlags = CpuAccessFlags.None, }; _VertexBuffer = new SlimDX.Direct3D11.Buffer(_Device, vertexData, bufferDesc); if (Result.Last.IsFailure) { return(Result.Last); } // Set vertex buffer _Device.ImmediateContext.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(_VertexBuffer, stride, 0)); // Create index buffer int[] indices = new int[] { 0, 1, 2, 1, 3, 2, 4, 5, 6, 5, 7, 6, 8, 9, 10, 9, 11, 10, 12, 13, 14, 13, 15, 14, }; bufferDesc.SizeInBytes = sizeof(int) * indices.Length; bufferDesc.BindFlags = BindFlags.IndexBuffer; _IndexBuffer = new SlimDX.Direct3D11.Buffer(_Device, new DataStream(indices, false, false), bufferDesc); if (Result.Last.IsFailure) { return(Result.Last); } // Set index buffer _Device.ImmediateContext.InputAssembler.SetIndexBuffer(_IndexBuffer, SlimDX.DXGI.Format.R32_UInt, 0); // Set primitive topology _Device.ImmediateContext.InputAssembler.PrimitiveTopology = PrimitiveTopology.TriangleList; // Load the Texture LoadTexture(); if (Result.Last.IsFailure) { return(Result.Last); } // Create the sample state SamplerDescription sampDesc = new SamplerDescription { Filter = Filter.MinMagMipPoint, AddressU = TextureAddressMode.Wrap, AddressV = TextureAddressMode.Wrap, AddressW = TextureAddressMode.Wrap, ComparisonFunction = Comparison.Never, MinimumLod = 0, MaximumLod = float.MaxValue, }; _SamplerLinear = SamplerState.FromDescription(_Device, sampDesc); if (Result.Last.IsFailure) { return(Result.Last); } return(ResultCode.Success); }