Exemplo n.º 1
0
        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);
        }
Exemplo n.º 3
0
        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);
        }
Exemplo n.º 4
0
        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);
        }