static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); //Application.Run(); var form = new MainForm(); var renderer = new Renderer(form, form.splitContainer2.Panel1); }
public Renderer(MainForm form, Control target) { t = new Stopwatch(); mainForm = form; targetControl = target; form.Renderer = this; description = new SwapChainDescription() { BufferCount = 2, Usage = Usage.RenderTargetOutput, OutputHandle = target.Handle, IsWindowed = true, ModeDescription = new ModeDescription(0, 0, new Rational(60, 1), Format.R8G8B8A8_UNorm), SampleDescription = new SampleDescription(1, 0), Flags = SwapChainFlags.AllowModeSwitch, SwapEffect = SwapEffect.Discard }; Device.CreateWithSwapChain(DriverType.Hardware, DeviceCreationFlags.Debug, description, out device, out swapChain); // create a view of our render target, which is the backbuffer of the swap chain we just created using (var resource = Resource.FromSwapChain<Texture2D>(swapChain, 0)) renderTarget = new RenderTargetView(device, resource); // setting a viewport is required if you want to actually see anything context = device.ImmediateContext; viewport = new Viewport(0.0f, 0.0f, target.ClientSize.Width, target.ClientSize.Height); context.OutputMerger.SetTargets(renderTarget); context.Rasterizer.SetViewports(viewport); CreateShaders(File.ReadAllText("vteffect.fx")); // prevent DXGI handling of alt+enter, which doesn't work properly with Winforms using (var factory = swapChain.GetParent<Factory>()) factory.SetWindowAssociation(target.Handle, WindowAssociationFlags.IgnoreAltEnter); // handle alt+enter ourselves form.KeyDown += (o, e) => { //if (e.Alt && e.KeyCode == Keys.Enter) //swapChain.IsFullScreen = !swapChain.IsFullScreen; }; // handle form size changes form.Resize += (o, e) => { renderTarget.Dispose(); viewport = new Viewport(0.0f, 0.0f, target.ClientSize.Width, target.ClientSize.Height); swapChain.ResizeBuffers(2, 0, 0, Format.R8G8B8A8_UNorm, SwapChainFlags.AllowModeSwitch); using (var resource = Resource.FromSwapChain<Texture2D>(swapChain, 0)) renderTarget = new RenderTargetView(device, resource); context.OutputMerger.SetTargets(renderTarget); context.Rasterizer.SetViewports(viewport); SetTexture(currentEntry); }; MessagePump.Run(form, Render); // clean up all resources // anything we missed will show up in the debug output vertices.Close(); vertexBuffer.Dispose(); layout.Dispose(); inputSignature.Dispose(); vertexShader.Dispose(); pixelShader.Dispose(); renderTarget.Dispose(); swapChain.Dispose(); device.Dispose(); UpdateRenderer = true; }