void host_SizeChanged(object sender, SizeChangedEventArgs e) { lock (syncObject) { if (device != null) { uint nWidth = (uint)host.ActualWidth; uint nHeight = (uint)host.ActualHeight; backBufferRenderTarget.Dispose(); device.OM.RenderTargets = new OutputMergerRenderTargets(new RenderTargetView[] { null }, null); //need to remove the reference to the swapchain's backbuffer to enable ResizeBuffers() call renderTargetView.Dispose(); depthStencilView.Dispose(); depthStencil.Dispose(); device.RS.Viewports = null; SwapChainDescription sd = swapChain.Description; //Change the swap chain's back buffer size, format, and number of buffers swapChain.ResizeBuffers( sd.BufferCount, nWidth, nHeight, sd.BufferDescription.Format, sd.Options); using (Texture2D pBuffer = swapChain.GetBuffer <Texture2D>(0)) { renderTargetView = device.CreateRenderTargetView(pBuffer); } InitializeDepthStencil(nWidth, nHeight); // bind the views to the device device.OM.RenderTargets = new OutputMergerRenderTargets(new[] { renderTargetView }, depthStencilView); SetViewport(nWidth, nHeight); CreateBackBufferD2DRenderTarget(); // update the aspect ratio projectionMatrix = Camera.MatrixPerspectiveFovLH( (float)Math.PI * 0.24f, // fovy nWidth / (float)nHeight, // aspect 0.1f, // zn 100.0f // zf ); projectionVariable.Matrix = projectionMatrix; } } }
public static void CreateDeviceSwapChainAndRenderTarget(Form form, out Device device, out SwapChain swapChain, out RenderTargetView renderTarget) { try { // the debug mode requires the sdk to be installed otherwise an exception is thrown device = new Device(DeviceCreationFlags.Debug); } catch (Direct3D10Exception) { device = new Device(DeviceCreationFlags.None); } var swapChainDescription = new SwapChainDescription(); var modeDescription = new ModeDescription(); var sampleDescription = new SampleDescription(); modeDescription.Format = Format.R8G8B8A8_UNorm; modeDescription.RefreshRate = new Rational(60, 1); modeDescription.Scaling = DisplayModeScaling.Unspecified; modeDescription.ScanlineOrdering = DisplayModeScanlineOrdering.Unspecified; modeDescription.Width = WIDTH; modeDescription.Height = HEIGHT; sampleDescription.Count = 1; sampleDescription.Quality = 0; swapChainDescription.ModeDescription = modeDescription; swapChainDescription.SampleDescription = sampleDescription; swapChainDescription.BufferCount = 1; swapChainDescription.Flags = SwapChainFlags.None; swapChainDescription.IsWindowed = true; swapChainDescription.OutputHandle = form.Handle; swapChainDescription.SwapEffect = SwapEffect.Discard; swapChainDescription.Usage = Usage.RenderTargetOutput; using (var factory = new Factory()) { swapChain = new SwapChain(factory, device, swapChainDescription); } using (var resource = swapChain.GetBuffer<Texture2D>(0)) { renderTarget = new RenderTargetView(device, resource); } var viewport = new Viewport { X = 0, Y = 0, Width = WIDTH, Height = HEIGHT, MinZ = 0.0f, MaxZ = 1.0f }; device.Rasterizer.SetViewports(viewport); device.OutputMerger.SetTargets(renderTarget); }
private void PrepareDefaultRenderTarget() { using (var backBuffer = swapChain.GetBuffer <Texture2D>(0)) { defaultRenderTargetView = new RenderTargetView(device, backBuffer); } }
/// <summary> /// Create Direct3D device and swap chain /// </summary> protected void InitDevice() { device = D3DDevice.CreateDeviceAndSwapChain(directControl.Handle); swapChain = device.SwapChain; // Create a render target view using (Texture2D pBuffer = swapChain.GetBuffer <Texture2D>(0)) { renderTargetView = device.CreateRenderTargetView(pBuffer); } device.OM.RenderTargets = new OutputMergerRenderTargets(new RenderTargetView[] { renderTargetView }); // Setup the viewport Viewport vp = new Viewport() { Width = (uint)directControl.ClientSize.Width, Height = (uint)directControl.ClientSize.Height, MinDepth = 0.0f, MaxDepth = 1.0f, TopLeftX = 0, TopLeftY = 0 }; device.RS.Viewports = new Viewport[] { vp }; }
/// <summary> /// Create Direct3D device and swap chain /// </summary> public void InitDevice() { device = D3DDevice.CreateDeviceAndSwapChain(host.Handle); swapChain = device.SwapChain; // Create a render target view using (Texture2D pBuffer = swapChain.GetBuffer<Texture2D>(0)) { renderTargetView = device.CreateRenderTargetView(pBuffer); } device.OM.RenderTargets = new OutputMergerRenderTargets(new RenderTargetView[] { renderTargetView }, null); // Setup the viewport Viewport vp = new Viewport() { Width = (uint)host.ActualWidth, Height = (uint)host.ActualHeight, MinDepth = 0.0f, MaxDepth = 1.0f, TopLeftX = 0, TopLeftY = 0 }; device.RS.Viewports = new Viewport[] { vp }; }
/// <summary> /// Create Direct3D device and swap chain /// </summary> protected void InitDevice() { device = D3DDevice.CreateDeviceAndSwapChain(directControl.Handle); swapChain = device.SwapChain; // Create a render target view using (Texture2D pBuffer = swapChain.GetBuffer<Texture2D>(0)) { renderTargetView = device.CreateRenderTargetView(pBuffer); } device.OM.RenderTargets = new OutputMergerRenderTargets(new RenderTargetView[] { renderTargetView }); // Setup the viewport Viewport vp = new Viewport() { Width = (uint)directControl.ClientSize.Width, Height = (uint)directControl.ClientSize.Height, MinDepth = 0.0f, MaxDepth = 1.0f, TopLeftX = 0, TopLeftY = 0 }; device.RS.Viewports = new Viewport[] { vp }; }
/// <summary> /// Create Direct3D device and swap chain /// </summary> public void InitDevice() { device = D3DDevice.CreateDeviceAndSwapChain(host.Handle); swapChain = device.SwapChain; // Create a render target view using (Texture2D pBuffer = swapChain.GetBuffer <Texture2D>(0)) { renderTargetView = device.CreateRenderTargetView(pBuffer); } device.OM.RenderTargets = new OutputMergerRenderTargets(new RenderTargetView[] { renderTargetView }, null); // Setup the viewport Viewport vp = new Viewport() { Width = (uint)host.ActualWidth, Height = (uint)host.ActualHeight, MinDepth = 0.0f, MaxDepth = 1.0f, TopLeftX = 0, TopLeftY = 0 }; device.RS.Viewports = new Viewport[] { vp }; }
//Separate to avoid fat method body (workaround for the Mono.Cecil bug) private unsafe void RebuildBackBuffer() { using (ComScopeGuard backBuffer = new ComScopeGuard(), renderView = new ComScopeGuard()) { SwapChain.GetBuffer(_swapchain, 0, Guids.Texture2D, out backBuffer.Ptr).Check(); Device.CreateRenderTargetView(_device, backBuffer.Ptr, null, out renderView.Ptr).Check(); _defaultRenderView = renderView.Move(); } }
void InitDevice() { // create Direct 3D device device = D3DDevice.CreateDeviceAndSwapChain(renderHost.Handle); swapChain = device.SwapChain; // Create a render target view using (Texture2D pBuffer = swapChain.GetBuffer <Texture2D>(0)) { renderTargetView = device.CreateRenderTargetView(pBuffer); } // Create depth stencil texture Texture2DDescription descDepth = new Texture2DDescription() { Width = (uint)renderHost.ActualWidth, Height = (uint)renderHost.ActualHeight, MipLevels = 1, ArraySize = 1, Format = Format.D32Float, SampleDescription = new SampleDescription() { Count = 1, Quality = 0 }, BindingOptions = BindingOptions.DepthStencil, }; depthStencil = device.CreateTexture2D(descDepth); // Create the depth stencil view DepthStencilViewDescription depthStencilViewDesc = new DepthStencilViewDescription() { Format = descDepth.Format, ViewDimension = DepthStencilViewDimension.Texture2D }; depthStencilView = device.CreateDepthStencilView(depthStencil, depthStencilViewDesc); // bind the views to the device device.OM.RenderTargets = new OutputMergerRenderTargets(new RenderTargetView[] { renderTargetView }, depthStencilView); // Setup the viewport Viewport vp = new Viewport() { Width = (uint)renderHost.ActualWidth, Height = (uint)renderHost.ActualHeight, MinDepth = 0.0f, MaxDepth = 1.0f, TopLeftX = 0, TopLeftY = 0 }; device.RS.Viewports = new Viewport[] { vp }; }
void InitDevice() { // create Direct 3D device device = D3DDevice.CreateDeviceAndSwapChain(renderHost.Handle); swapChain = device.SwapChain; // Create a render target view using (Texture2D pBuffer = swapChain.GetBuffer<Texture2D>(0)) { renderTargetView = device.CreateRenderTargetView(pBuffer); } // Create depth stencil texture Texture2DDescription descDepth = new Texture2DDescription() { Width = (uint)renderHost.ActualWidth, Height = (uint)renderHost.ActualHeight, MipLevels = 1, ArraySize = 1, Format = Format.D32Float, SampleDescription = new SampleDescription() { Count = 1, Quality = 0 }, BindingOptions = BindingOptions.DepthStencil, }; depthStencil = device.CreateTexture2D(descDepth); // Create the depth stencil view DepthStencilViewDescription depthStencilViewDesc = new DepthStencilViewDescription() { Format = descDepth.Format, ViewDimension = DepthStencilViewDimension.Texture2D }; depthStencilView = device.CreateDepthStencilView(depthStencil, depthStencilViewDesc); // bind the views to the device device.OM.RenderTargets = new OutputMergerRenderTargets(new RenderTargetView[] { renderTargetView }, depthStencilView); // Setup the viewport Viewport vp = new Viewport() { Width = (uint)renderHost.ActualWidth, Height = (uint)renderHost.ActualHeight, MinDepth = 0.0f, MaxDepth = 1.0f, TopLeftX = 0, TopLeftY = 0 }; device.RS.Viewports = new Viewport[] { vp }; }
public void Resize(int w, int h) { // TODO: //DeviceContext.OMSetRenderTargets(null); m_RenderTargetView.Dispose(); SwapChain.ResizeBuffers(0, w, h, Format.Unknown, SwapChainFlags.None); ID3D11Texture2D buffer = SwapChain.GetBuffer <ID3D11Texture2D>(0); //m_RenderTargetView = //buffer.Dispose(); //BuildDepthStencilView(w, h); //DeviceContext.OMSetRenderTargets(m_RenderTargetView, m_DepthStencilView); //DeviceContext.RSSetViewport(0, 0, w, h, ToolkitSettings.ScreenNear, ToolkitSettings.ScreenDepth); }
private void SetViews() { Texture2D texture2D = swapChain.GetBuffer <Texture2D>(0); renderTargetView = device.CreateRenderTargetView(texture2D); deviceContext.OM.RenderTargets = new OutputMergerRenderTargets(new RenderTargetView[] { renderTargetView }); texture2D.Dispose(); // viewport SwapChainDescription desc = swapChain.Description; Viewport viewport = new Viewport(); viewport.Width = desc.BufferDescription.Width; viewport.Height = desc.BufferDescription.Height; viewport.MinDepth = 0.0f; viewport.MaxDepth = 1.0f; viewport.TopLeftX = 0; viewport.TopLeftY = 0; deviceContext.RS.Viewports = new Viewport[] { viewport }; }
private void SetViews() { // Create a render target view using (Texture2D pBuffer = swapChain.GetBuffer <Texture2D>(0)) { renderTargetView = device.CreateRenderTargetView(pBuffer); } device.OM.RenderTargets = new OutputMergerRenderTargets(new RenderTargetView[] { renderTargetView }, null); // Setup the viewport Viewport vp = new Viewport() { Width = (uint)directControl.ClientSize.Width, Height = (uint)directControl.ClientSize.Height, MinDepth = 0.0f, MaxDepth = 1.0f, TopLeftX = 0, TopLeftY = 0 }; device.RS.Viewports = new Viewport[] { vp }; }
private void SetViews() { // Create a render target view using (Texture2D buffer = swapChain.GetBuffer <Texture2D>(0)) { renderTargetView = device.CreateRenderTargetView(buffer); } //bind the views to the device device.OM.RenderTargets = new OutputMergerRenderTargets(new RenderTargetView[] { renderTargetView }); // Setup the viewport Viewport vp = new Viewport() { Width = (uint)host.ActualWidth, Height = (uint)host.ActualHeight, MinDepth = 0.0f, MaxDepth = 1.0f, TopLeftX = 0, TopLeftY = 0 }; device.RS.Viewports = new Viewport[] { vp }; }
public static Texture2D FromSwapChain(SwapChain swapChain, int index) { return swapChain.GetBuffer(index); }
void CreateDeviceResources() { uint nWidth = (uint)host.ActualWidth; uint nHeight = (uint)host.ActualHeight; // Create D3D device and swap chain SwapChainDescription swapDesc = new SwapChainDescription { BufferDescription = new ModeDescription { Width = nWidth, Height = nHeight, Format = Format.R8G8B8A8UNorm, RefreshRate = new Rational { Numerator = 60, Denominator = 1 } }, SampleDescription = new SampleDescription { Count = 1, Quality = 0 }, BufferUsage = UsageOptions.RenderTargetOutput, BufferCount = 1, OutputWindowHandle = host.Handle, Windowed = true }; device = D3DDevice1.CreateDeviceAndSwapChain1( null, DriverType.Hardware, null, CreateDeviceOptions.SupportBgra, FeatureLevel.NinePointThree, swapDesc ); swapChain = device.SwapChain; using (Texture2D pBuffer = swapChain.GetBuffer <Texture2D>(0)) { renderTargetView = device.CreateRenderTargetView(pBuffer); } MakeBothSidesRendered(); InitializeDepthStencil(nWidth, nHeight); device.OM.RenderTargets = new OutputMergerRenderTargets(new[] { renderTargetView }, depthStencilView); // Set a new viewport based on the new dimensions SetViewport(nWidth, nHeight); // Load pixel shader shader = LoadResourceShader(device, "Microsoft.WindowsAPICodePack.DirectX.Samples.dxgisample.fxo"); // Obtain the technique technique = shader.GetTechniqueByName("Render"); // Create the input layout InitializeGeometryBuffers(); // Obtain the variables Initialize3DTransformations(nWidth, nHeight); // Allocate a offscreen D3D surface for D2D to render our 2D content into InitializeTextureRenderTarget(); // Create a D2D render target which can draw into the surface in the swap chain CreateD2DRenderTargets(); }
void CreateDeviceResources() { uint width = (uint)host.ActualWidth; uint height = (uint)host.ActualHeight; // If we don't have a device, need to create one now and all // accompanying D3D resources. CreateDevice(); Factory dxgiFactory = Factory.Create(); SwapChainDescription swapDesc = new SwapChainDescription { BufferDescription = new ModeDescription { Width = width, Height = height, Format = Format.R8G8B8A8UNorm, RefreshRate = new Rational { Numerator = 60, Denominator = 1 } }, SampleDescription = new SampleDescription { Count = 1, Quality = 0 }, BufferUsage = UsageOptions.RenderTargetOutput, BufferCount = 1, OutputWindowHandle = host.Handle, Windowed = true }; swapChain = dxgiFactory.CreateSwapChain( device, swapDesc); // Create rasterizer state object RasterizerDescription rsDesc = new RasterizerDescription(); rsDesc.AntiAliasedLineEnable = false; rsDesc.CullMode = CullMode.None; rsDesc.DepthBias = 0; rsDesc.DepthBiasClamp = 0; rsDesc.DepthClipEnable = true; rsDesc.FillMode = D3D10.FillMode.Solid; rsDesc.FrontCounterclockwise = false; // Must be FALSE for 10on9 rsDesc.MultisampleEnable = false; rsDesc.ScissorEnable = false; rsDesc.SlopeScaledDepthBias = 0; rasterizerState = device.CreateRasterizerState( rsDesc); device.RS.State = rasterizerState; // If we don't have a D2D render target, need to create all of the resources // required to render to one here. // Ensure that nobody is holding onto one of the old resources device.OM.RenderTargets = new OutputMergerRenderTargets(new RenderTargetView[] { null }); InitializeDepthStencil(width, height); // Create views on the RT buffers and set them on the device RenderTargetViewDescription renderDesc = new RenderTargetViewDescription(); renderDesc.Format = Format.R8G8B8A8UNorm; renderDesc.ViewDimension = RenderTargetViewDimension.Texture2D; Texture2DRenderTargetView renderView = renderDesc.Texture2D; renderView.MipSlice = 0; renderDesc.Texture2D = renderView; using (D3DResource spBackBufferResource = swapChain.GetBuffer <D3DResource>(0)) { renderTargetView = device.CreateRenderTargetView( spBackBufferResource, renderDesc); } device.OM.RenderTargets = new OutputMergerRenderTargets(new RenderTargetView[] { renderTargetView }, depthStencilView); SetViewport(width, height); // Create a D2D render target which can draw into the surface in the swap chain RenderTargetProperties props = new RenderTargetProperties( RenderTargetType.Default, new PixelFormat(Format.Unknown, AlphaMode.Premultiplied), 96, 96, RenderTargetUsages.None, FeatureLevel.Default); // Allocate a offscreen D3D surface for D2D to render our 2D content into Texture2DDescription tex2DDescription = new Texture2DDescription { ArraySize = 1, BindingOptions = BindingOptions.RenderTarget | BindingOptions.ShaderResource, CpuAccessOptions = CpuAccessOptions.None, Format = Format.R8G8B8A8UNorm, Height = 4096, Width = 512, MipLevels = 1, MiscellaneousResourceOptions = MiscellaneousResourceOptions.None, SampleDescription = new SampleDescription { Count = 1, Quality = 0 }, Usage = Usage.Default }; offscreenTexture = device.CreateTexture2D(tex2DDescription); using (Surface dxgiSurface = offscreenTexture.GraphicsSurface) { // Create a D2D render target which can draw into our offscreen D3D surface renderTarget = d2DFactory.CreateGraphicsSurfaceRenderTarget( dxgiSurface, props); } PixelFormat alphaOnlyFormat = new PixelFormat(Format.A8UNorm, AlphaMode.Premultiplied); opacityRenderTarget = renderTarget.CreateCompatibleRenderTarget(CompatibleRenderTargetOptions.None, alphaOnlyFormat); // Load pixel shader // Open precompiled vertex shader // This file was compiled using DirectX's SDK Shader compilation tool: // fxc.exe /T fx_4_0 /Fo SciFiText.fxo SciFiText.fx shader = LoadResourceShader(device, "SciFiTextDemo.SciFiText.fxo"); // Obtain the technique technique = shader.GetTechniqueByName("Render"); // Obtain the variables worldMatrixVariable = shader.GetVariableByName("World").AsMatrix; viewMatrixVariable = shader.GetVariableByName("View").AsMatrix; projectionMarixVariable = shader.GetVariableByName("Projection").AsMatrix; diffuseVariable = shader.GetVariableByName("txDiffuse").AsShaderResource; // Create the input layout PassDescription passDesc = new PassDescription(); passDesc = technique.GetPassByIndex(0).Description; vertexLayout = device.CreateInputLayout( inputLayoutDescriptions, passDesc.InputAssemblerInputSignature, passDesc.InputAssemblerInputSignatureSize ); // Set the input layout device.IA.InputLayout = vertexLayout; IntPtr verticesDataPtr = Marshal.AllocHGlobal(Marshal.SizeOf(VertexArray.VerticesInstance)); Marshal.StructureToPtr(VertexArray.VerticesInstance, verticesDataPtr, true); BufferDescription bd = new BufferDescription(); bd.Usage = Usage.Default; bd.ByteWidth = (uint)Marshal.SizeOf(VertexArray.VerticesInstance); bd.BindingOptions = BindingOptions.VertexBuffer; bd.CpuAccessOptions = CpuAccessOptions.None; bd.MiscellaneousResourceOptions = MiscellaneousResourceOptions.None; SubresourceData InitData = new SubresourceData { SystemMemory = verticesDataPtr }; vertexBuffer = device.CreateBuffer(bd, InitData); Marshal.FreeHGlobal(verticesDataPtr); // Set vertex buffer uint stride = (uint)Marshal.SizeOf(typeof(SimpleVertex)); uint offset = 0; device.IA.SetVertexBuffers( 0, new D3DBuffer[] { vertexBuffer }, new uint[] { stride }, new uint[] { offset } ); IntPtr indicesDataPtr = Marshal.AllocHGlobal(Marshal.SizeOf(VertexArray.IndicesInstance)); Marshal.StructureToPtr(VertexArray.IndicesInstance, indicesDataPtr, true); bd.Usage = Usage.Default; bd.ByteWidth = (uint)Marshal.SizeOf(VertexArray.IndicesInstance); bd.BindingOptions = BindingOptions.IndexBuffer; bd.CpuAccessOptions = CpuAccessOptions.None; bd.MiscellaneousResourceOptions = MiscellaneousResourceOptions.None; InitData.SystemMemory = indicesDataPtr; facesIndexBuffer = device.CreateBuffer( bd, InitData ); Marshal.FreeHGlobal(indicesDataPtr); // Set primitive topology device.IA.PrimitiveTopology = PrimitiveTopology.TriangleList; // Convert the D2D texture into a Shader Resource View textureResourceView = device.CreateShaderResourceView( offscreenTexture); // Initialize the world matrices worldMatrix = Matrix4x4F.Identity; // Initialize the view matrix Vector3F Eye = new Vector3F(0.0f, 0.0f, 13.0f); Vector3F At = new Vector3F(0.0f, -3.5f, 45.0f); Vector3F Up = new Vector3F(0.0f, 1.0f, 0.0f); viewMatrix = Camera.MatrixLookAtLH(Eye, At, Up); // Initialize the projection matrix projectionMatrix = Camera.MatrixPerspectiveFovLH( (float)Math.PI * 0.1f, width / (float)height, 0.1f, 100.0f); // Update Variables that never change viewMatrixVariable.Matrix = viewMatrix; projectionMarixVariable.Matrix = projectionMatrix; GradientStop[] gradientStops = { new GradientStop(0.0f, new ColorF(GetColorValues(System.Windows.Media.Colors.Yellow))), new GradientStop(1.0f, new ColorF(GetColorValues(System.Windows.Media.Colors.Black))) }; GradientStopCollection spGradientStopCollection = renderTarget.CreateGradientStopCollection( gradientStops, Gamma.StandardRgb, ExtendMode.Clamp); // Create a linear gradient brush for text textBrush = renderTarget.CreateLinearGradientBrush( new LinearGradientBrushProperties(new Point2F(0, 0), new Point2F(0, -2048)), spGradientStopCollection ); }
public unsafe static LightDevice Create(Control ctrl, int initWidth = -1, int initHeight = -1) { var ret = new LightDevice(); //initialize size { var width = initWidth == -1 ? ctrl.ClientSize.Width : initWidth; var height = initHeight == -1 ? ctrl.ClientSize.Height : initHeight; ret._ctrl = ctrl; ret._form = ctrl.FindForm(); ret._width = width; ret._height = height; ret._dpi = GetDpiForWindow(ret._form.Handle); } try { using (var adapter = new ComScopeGuard()) { //Find the adapter adapter.Ptr = GetAdapter(); //create core objects IntPtr swapChain, device, immediateContext; { var d = new SwapChainDescription(ctrl.Handle, ret._width, ret._height); Native.D3D11CreateDeviceAndSwapChain( adapter.Ptr, adapter.Ptr == IntPtr.Zero ? 1u : 0u, IntPtr.Zero, 0, IntPtr.Zero, 0, 7, ref d, out swapChain, out device, out var featureLevel, out immediateContext).Check(); ret._device = device; ret._swapchain = swapChain; ret._context = immediateContext; } //get default render target IntPtr renderView; { using (var backBuffer = new ComScopeGuard()) { SwapChain.GetBuffer(swapChain, 0, Guids.Texture2D, out backBuffer.Ptr).Check(); Device.CreateRenderTargetView(device, backBuffer.Ptr, null, out renderView).Check(); } ret._defaultRenderView = renderView; } //get DXGI.Output { var i = Adapter.EnumOutputs(adapter.Ptr, 0, out var output); //Sometimes this can fail, but it should not affect our other functions. //TODO Actually we should think of supporting multiple outputs. if (i != 0x887A0002) { i.Check(); } ret._output = output; } ret._defaultRenderTarget = RenderTargetObject.CreateSwapchainTarget(ret); ret.AddEventHandlers(); } } catch (NativeException e) { ret.Dispose(true); throw e; } return(ret); }
void Window1_SizeChanged(object sender, SizeChangedEventArgs e) { if (device != null) { //need to remove the reference to the swapchain's backbuffer to enable ResizeBuffers() call renderTargetView.Dispose(); SwapChainDescription sd = swapChain.Description; swapChain.ResizeBuffers( sd.BufferCount, (uint)renderHost.ActualWidth, (uint)renderHost.ActualHeight, sd.BufferDescription.Format, sd.Options); using (Texture2D pBuffer = swapChain.GetBuffer <Texture2D>(0)) { renderTargetView = device.CreateRenderTargetView(pBuffer); } // Create depth stencil texture Texture2DDescription descDepth = new Texture2DDescription() { Width = (uint)renderHost.ActualWidth, Height = (uint)renderHost.ActualHeight, MipLevels = 1, ArraySize = 1, Format = Format.D32Float, SampleDescription = new SampleDescription() { Count = 1, Quality = 0 }, BindingOptions = BindingOptions.DepthStencil, }; depthStencil = device.CreateTexture2D(descDepth); // Create the depth stencil view DepthStencilViewDescription depthStencilViewDesc = new DepthStencilViewDescription() { Format = descDepth.Format, ViewDimension = DepthStencilViewDimension.Texture2D }; depthStencilView = device.CreateDepthStencilView(depthStencil, depthStencilViewDesc); // bind the views to the device device.OM.RenderTargets = new OutputMergerRenderTargets(new RenderTargetView[] { renderTargetView }, depthStencilView); // Setup the viewport Viewport vp = new Viewport() { Width = (uint)renderHost.ActualWidth, Height = (uint)renderHost.ActualHeight, MinDepth = 0.0f, MaxDepth = 1.0f, TopLeftX = 0, TopLeftY = 0 }; device.RS.Viewports = new Viewport[] { vp }; } }
public static Texture2D FromSwapChain(SwapChain swapChain, int index) { return(swapChain.GetBuffer(index)); }
void CreateDeviceResources() { uint width = (uint) host.ActualWidth; uint height = (uint) host.ActualHeight; // If we don't have a device, need to create one now and all // accompanying D3D resources. CreateDevice(); DXGIFactory dxgiFactory = DXGIFactory.CreateFactory(); SwapChainDescription swapDesc = new SwapChainDescription(); swapDesc.BufferDescription.Width = width; swapDesc.BufferDescription.Height = height; swapDesc.BufferDescription.Format = Format.R8G8B8A8_UNORM; swapDesc.BufferDescription.RefreshRate.Numerator = 60; swapDesc.BufferDescription.RefreshRate.Denominator = 1; swapDesc.SampleDescription.Count = 1; swapDesc.SampleDescription.Quality = 0; swapDesc.BufferUsage = UsageOption.RenderTargetOutput; swapDesc.BufferCount = 1; swapDesc.OutputWindowHandle = host.Handle; swapDesc.Windowed = true; swapChain = dxgiFactory.CreateSwapChain( device, swapDesc); // Create rasterizer state object RasterizerDescription rsDesc = new RasterizerDescription(); rsDesc.AntialiasedLineEnable = false; rsDesc.CullMode = CullMode.None; rsDesc.DepthBias = 0; rsDesc.DepthBiasClamp = 0; rsDesc.DepthClipEnable = true; rsDesc.FillMode = D3D10.FillMode.Solid; rsDesc.FrontCounterClockwise = false; // Must be FALSE for 10on9 rsDesc.MultisampleEnable = false; rsDesc.ScissorEnable = false; rsDesc.SlopeScaledDepthBias = 0; rasterizerState = device.CreateRasterizerState( rsDesc); device.RS.SetState( rasterizerState ); // If we don't have a D2D render target, need to create all of the resources // required to render to one here. // Ensure that nobody is holding onto one of the old resources device.OM.SetRenderTargets(new RenderTargetView[] {null}); InitializeDepthStencil(width, height); // Create views on the RT buffers and set them on the device RenderTargetViewDescription renderDesc = new RenderTargetViewDescription(); renderDesc.Format = Format.R8G8B8A8_UNORM; renderDesc.ViewDimension = RenderTargetViewDimension.Texture2D; renderDesc.Texture2D.MipSlice = 0; using (D3DResource spBackBufferResource = swapChain.GetBuffer<D3DResource>(0)) { renderTargetView = device.CreateRenderTargetView( spBackBufferResource, renderDesc); } device.OM.SetRenderTargets(new RenderTargetView[] {renderTargetView}, depthStencilView); SetViewport(width, height); // Create a D2D render target which can draw into the surface in the swap chain RenderTargetProperties props = new RenderTargetProperties( RenderTargetType.Default, new PixelFormat(Format.Unknown, AlphaMode.Premultiplied), 96, 96, RenderTargetUsage.None, FeatureLevel.Default); // Allocate a offscreen D3D surface for D2D to render our 2D content into Texture2DDescription tex2DDescription; tex2DDescription.ArraySize = 1; tex2DDescription.BindFlags = BindFlag.RenderTarget | BindFlag.ShaderResource; tex2DDescription.CpuAccessFlags = CpuAccessFlag.Unspecified; tex2DDescription.Format = Format.R8G8B8A8_UNORM; tex2DDescription.Height = 4096; tex2DDescription.Width = 512; tex2DDescription.MipLevels = 1; tex2DDescription.MiscFlags = 0; tex2DDescription.SampleDescription.Count = 1; tex2DDescription.SampleDescription.Quality = 0; tex2DDescription.Usage = Usage.Default; offscreenTexture = device.CreateTexture2D(tex2DDescription); using (Surface dxgiSurface = offscreenTexture.GetDXGISurface()) { // Create a D2D render target which can draw into our offscreen D3D surface renderTarget = d2DFactory.CreateDxgiSurfaceRenderTarget( dxgiSurface, props); } PixelFormat alphaOnlyFormat = new PixelFormat(Format.A8_UNORM, AlphaMode.Premultiplied); opacityRenderTarget = renderTarget.CreateCompatibleRenderTarget(CompatibleRenderTargetOptions.None, alphaOnlyFormat); // Load pixel shader // Open precompiled vertex shader // This file was compiled using DirectX's SDK Shader compilation tool: // fxc.exe /T fx_4_0 /Fo SciFiText.fxo SciFiText.fx shader = LoadResourceShader(device, "SciFiTextDemo.SciFiText.fxo"); // Obtain the technique technique = shader.GetTechniqueByName("Render"); // Obtain the variables worldMatrixVariable = shader.GetVariableByName("World").AsMatrix(); viewMatrixVariable = shader.GetVariableByName("View").AsMatrix(); projectionMarixVariable = shader.GetVariableByName("Projection").AsMatrix(); diffuseVariable = shader.GetVariableByName("txDiffuse").AsShaderResource(); // Create the input layout PassDescription passDesc = new PassDescription(); passDesc = technique.GetPassByIndex(0).Description; vertexLayout = device.CreateInputLayout( inputLayoutDescriptions, passDesc.InputAssemblerInputSignature, passDesc.InputAssemblerInputSignatureSize ); // Set the input layout device.IA.SetInputLayout( vertexLayout ); IntPtr verticesDataPtr = Marshal.AllocHGlobal(Marshal.SizeOf(VertexArray.VerticesInstance)); Marshal.StructureToPtr(VertexArray.VerticesInstance, verticesDataPtr, true); BufferDescription bd = new BufferDescription(); bd.Usage = Usage.Default; bd.ByteWidth = (uint) Marshal.SizeOf(VertexArray.VerticesInstance); bd.BindFlags = BindFlag.VertexBuffer; bd.CpuAccessFlags = CpuAccessFlag.Unspecified; bd.MiscFlags = ResourceMiscFlag.Undefined; SubresourceData InitData = new SubresourceData() { SysMem = verticesDataPtr }; vertexBuffer = device.CreateBuffer( bd, InitData ); Marshal.FreeHGlobal(verticesDataPtr); // Set vertex buffer uint stride = (uint) Marshal.SizeOf(typeof (SimpleVertex)); uint offset = 0; device.IA.SetVertexBuffers( 0, new D3DBuffer[] {vertexBuffer}, new uint[] {stride}, new uint[] {offset} ); IntPtr indicesDataPtr = Marshal.AllocHGlobal(Marshal.SizeOf(VertexArray.IndicesInstance)); Marshal.StructureToPtr(VertexArray.IndicesInstance, indicesDataPtr, true); bd.Usage = Usage.Default; bd.ByteWidth = (uint) Marshal.SizeOf(VertexArray.IndicesInstance); bd.BindFlags = BindFlag.IndexBuffer; bd.CpuAccessFlags = 0; bd.MiscFlags = 0; InitData.SysMem = indicesDataPtr; facesIndexBuffer = device.CreateBuffer( bd, InitData ); Marshal.FreeHGlobal(indicesDataPtr); // Set primitive topology device.IA.SetPrimitiveTopology(PrimitiveTopology.TriangleList); // Convert the D2D texture into a Shader Resource View textureResourceView = device.CreateShaderResourceView( offscreenTexture); // Initialize the world matrices worldMatrix = Matrix4x4F.Identity; // Initialize the view matrix Vector3F Eye = new Vector3F(0.0f, 0.0f, 13.0f); Vector3F At = new Vector3F(0.0f, -3.5f, 45.0f); Vector3F Up = new Vector3F(0.0f, 1.0f, 0.0f); viewMatrix = Camera.MatrixLookAtLH(Eye, At, Up); // Initialize the projection matrix projectionMatrix = Camera.MatrixPerspectiveFovLH( (float) Math.PI*0.1f, width/(float) height, 0.1f, 100.0f); // Update Variables that never change viewMatrixVariable.Matrix = viewMatrix; projectionMarixVariable.Matrix = projectionMatrix; GradientStop[] gradientStops = { new GradientStop(0.0f, new ColorF(Colors.Yellow)), new GradientStop(1.0f, new ColorF(Colors.Black)) }; GradientStopCollection spGradientStopCollection = renderTarget.CreateGradientStopCollection( gradientStops, Gamma.Gamma_22, ExtendMode.Clamp); // Create a linear gradient brush for text textBrush = renderTarget.CreateLinearGradientBrush( new LinearGradientBrushProperties(new Point2F(0, 0), new Point2F(0, -2048)), spGradientStopCollection ); }
public bool Init(IntPtr WindowHandle) { var factory = DXGI.CreateDXGIFactory1 <IDXGIFactory1>(); var adapter = factory.GetAdapter1(0); var monitor = adapter.GetOutput(0); var modes = monitor.GetDisplayModeList(Format.R8G8B8A8_UNorm, DisplayModeEnumerationFlags.Interlaced); var rational = new Rational(0, 1); var adapterDescription = adapter.Description; //VideoCardMemory = adapterDescription.DedicatedVideoMemory >> 10 >> 10; //VideoCardDescription = adapterDescription.Description.Trim('\0'); monitor.Dispose(); adapter.Dispose(); var swapChainDesc = new SwapChainDescription() { BufferCount = 2, BufferDescription = new ModeDescription(1920, 1080, rational, Format.R8G8B8A8_UNorm), Usage = Usage.RenderTargetOutput, OutputWindow = WindowHandle, SampleDescription = new SampleDescription(1, 0), IsWindowed = true, Flags = SwapChainFlags.None, SwapEffect = SwapEffect.Discard }; // Create Device and DeviceContext ID3D11Device TempDevice = null; ID3D11DeviceContext TempDeviceContext = null; D3D11.D3D11CreateDevice(adapter, DriverType.Hardware, DeviceCreationFlags.None, null, out TempDevice, out TempDeviceContext); Device = TempDevice.QueryInterface <ID3D11Device1>(); DeviceContext = TempDeviceContext.QueryInterface <ID3D11DeviceContext1>(); TempDevice.Dispose(); TempDeviceContext.Dispose(); // Create SwapChain SwapChain = factory.CreateSwapChain(Device, swapChainDesc); factory.MakeWindowAssociation(WindowHandle, WindowAssociationFlags.IgnoreAltEnter); var backBuffer = SwapChain.GetBuffer <ID3D11Texture2D>(0); m_RenderTargetView = Device.CreateRenderTargetView(backBuffer); backBuffer.Dispose(); // Create blend state BlendDescription bsd = new BlendDescription() { AlphaToCoverageEnable = false,//true, IndependentBlendEnable = false, }; bsd.RenderTarget[0].BlendOperationAlpha = BlendOperation.Add; bsd.RenderTarget[0].BlendOperation = BlendOperation.Add; bsd.RenderTarget[0].DestinationBlendAlpha = Blend.One; bsd.RenderTarget[0].DestinationBlend = Blend.InverseSourceAlpha; bsd.RenderTarget[0].IsBlendEnabled = true; bsd.RenderTarget[0].RenderTargetWriteMask = ColorWriteEnable.All; bsd.RenderTarget[0].SourceBlendAlpha = Blend.Zero; bsd.RenderTarget[0].SourceBlend = Blend.SourceAlpha; bsd.AlphaToCoverageEnable = true; ID3D11BlendState bsAlpha = Device.CreateBlendState(bsd); // Set Blend State DeviceContext.OMSetBlendState(bsAlpha); BuildDepthStencilView(1920, 1080); // Create rasterizers m_RSDesc = new RasterizerDescription() { AntialiasedLineEnable = false, CullMode = CullMode.Back, DepthBias = 0, DepthBiasClamp = .0f, DepthClipEnable = false, FillMode = FillMode.Solid, FrontCounterClockwise = true, MultisampleEnable = true, ScissorEnable = false, SlopeScaledDepthBias = .0f }; m_RSCullSolid = Device.CreateRasterizerState(m_RSDesc); m_RSDesc.CullMode = CullMode.None; m_RSSolid = Device.CreateRasterizerState(m_RSDesc); m_RSDesc.FillMode = FillMode.Wireframe; m_RSWireFrame = Device.CreateRasterizerState(m_RSDesc); m_RSDesc.CullMode = CullMode.Back; m_RSCullWireFrame = Device.CreateRasterizerState(m_RSDesc); UpdateRasterizer(); return(true); }
/// <summary> /// Gets a swap chain back buffer. /// </summary> /// <param name="swapChain">The swap chain to get the buffer from.</param> /// <param name="index">The index of the desired buffer.</param> /// <returns>The buffer interface, or <c>null</c> on failure.</returns> public static Surface FromSwapChain(SwapChain swapChain, int index) { IntPtr surfacePointer; swapChain.GetBuffer(index, Utilities.GetGuidFromType(typeof (Surface)), out surfacePointer); return new Surface(surfacePointer); }
private void CreateSwapChainRenderTargetAndViewport() { var swapChainDescription = CreateSwapChainDescription(); using (var factory = new Factory()) { mSwapChain = new SwapChain(factory, mDevice, swapChainDescription); } using (var resource = mSwapChain.GetBuffer<Texture2D>(0)) { mRenderTarget = new RenderTargetView(mDevice, resource); } var viewport = new Viewport { X = 0, Y = 0, Width = mWidth, Height = mHeight, MinZ = 0.0f, MaxZ = 1.0f }; CreateDepthBuffer(); mDevice.Rasterizer.SetViewports(viewport); mDevice.OutputMerger.SetTargets( mDepthStencilView, mRenderTarget); }
void CreateDeviceResources() { uint nWidth = (uint)host.ActualWidth; uint nHeight = (uint)host.ActualHeight; // Create D3D device and swap chain SwapChainDescription swapDesc = new SwapChainDescription { BufferDescription = new ModeDescription { Width = nWidth, Height = nHeight, Format = Format.R8G8B8A8UNorm, RefreshRate = new Rational { Numerator = 60, Denominator = 1 } }, SampleDescription = new SampleDescription { Count = 1, Quality = 0 }, BufferUsage = UsageOptions.RenderTargetOutput, BufferCount = 1, OutputWindowHandle = host.Handle, Windowed = true }; device = D3DDevice1.CreateDeviceAndSwapChain1( null, DriverType.Hardware, null, CreateDeviceOptions.SupportBgra, FeatureLevel.NinePointThree, swapDesc ); swapChain = device.SwapChain; using (Texture2D pBuffer = swapChain.GetBuffer<Texture2D>(0)) { renderTargetView = device.CreateRenderTargetView(pBuffer); } MakeBothSidesRendered(); InitializeDepthStencil(nWidth, nHeight); device.OM.RenderTargets = new OutputMergerRenderTargets(new[] { renderTargetView }, depthStencilView); // Set a new viewport based on the new dimensions SetViewport(nWidth, nHeight); // Load pixel shader shader = LoadResourceShader(device, "Microsoft.WindowsAPICodePack.DirectX.Samples.dxgisample.fxo"); // Obtain the technique technique = shader.GetTechniqueByName("Render"); // Create the input layout InitializeGeometryBuffers(); // Obtain the variables Initialize3DTransformations(nWidth, nHeight); // Allocate a offscreen D3D surface for D2D to render our 2D content into InitializeTextureRenderTarget(); // Create a D2D render target which can draw into the surface in the swap chain CreateD2DRenderTargets(); }
protected Application(bool useDirect3D12) { _wndProc = ProcessWindowMessage; var wndClassEx = new WNDCLASSEX { Size = Unsafe.SizeOf <WNDCLASSEX>(), Styles = WindowClassStyles.CS_HREDRAW | WindowClassStyles.CS_VREDRAW | WindowClassStyles.CS_OWNDC, WindowProc = _wndProc, InstanceHandle = HInstance, CursorHandle = LoadCursor(IntPtr.Zero, SystemCursor.IDC_ARROW), BackgroundBrushHandle = IntPtr.Zero, IconHandle = IntPtr.Zero, ClassName = WndClassName, }; var atom = RegisterClassEx(ref wndClassEx); if (atom == 0) { throw new InvalidOperationException( $"Failed to register window class. Error: {Marshal.GetLastWin32Error()}" ); } Window = new Window("Vortice", 800, 600); if (useDirect3D12 && !ID3D12Device.IsSupported(null, FeatureLevel.Level_11_0)) { useDirect3D12 = false; } var debugFactory = false; #if DEBUG if (useDirect3D12) { if (D3D12GetDebugInterface <ID3D12Debug>(out var debug).Success) { debug.EnableDebugLayer(); debugFactory = true; } } #endif if (useDirect3D12) { if (CreateDXGIFactory2(debugFactory, out IDXGIFactory4 dxgiFactory4).Failure) { throw new InvalidOperationException("Cannot create IDXGIFactory4"); } _dxgiFactory = dxgiFactory4; } else { if (CreateDXGIFactory2(debugFactory, out _dxgiFactory).Failure) { throw new InvalidOperationException("Cannot create IDXGIFactory4"); } } if (useDirect3D12) { Debug.Assert(D3D12CreateDevice(null, FeatureLevel.Level_11_0, out _d3d12Device).Success); _d3d12CommandQueue = _d3d12Device.CreateCommandQueue(new CommandQueueDescription(CommandListType.Direct, CommandQueuePriority.Normal)); } else { var featureLevels = new FeatureLevel[] { FeatureLevel.Level_11_1, FeatureLevel.Level_11_0 }; Debug.Assert(ID3D11Device.TryCreate( null, DriverType.Hardware, DeviceCreationFlags.BgraSupport, featureLevels, out _d3d11Device, out _d3d11DeviceContext).Success); } var swapChainDesc = new SwapChainDescription1 { BufferCount = FrameCount, Width = Window.Width, Height = Window.Height, Format = Format.B8G8R8A8_UNorm, Usage = Vortice.Usage.RenderTargetOutput, SwapEffect = SwapEffect.FlipDiscard, SampleDescription = new SampleDescription(1, 0) }; SwapChain = DXGIFactory.CreateSwapChainForHwnd(_d3d12CommandQueue, Window.Handle, swapChainDesc); DXGIFactory.MakeWindowAssociation(Window.Handle, WindowAssociationFlags.IgnoreAltEnter); if (useDirect3D12) { SwapChain3 = SwapChain.QueryInterface <IDXGISwapChain3>(); _frameIndex = SwapChain3.GetCurrentBackBufferIndex(); } _rtvHeap = _d3d12Device.CreateDescriptorHeap(new DescriptorHeapDescription(DescriptorHeapType.RenderTargetView, FrameCount)); _rtvDescriptorSize = _d3d12Device.GetDescriptorHandleIncrementSize(DescriptorHeapType.RenderTargetView); // Create frame resources. { var rtvHandle = _rtvHeap.GetCPUDescriptorHandleForHeapStart(); // Create a RTV for each frame. _renderTargets = new ID3D12Resource[FrameCount]; for (var i = 0; i < FrameCount; i++) { _renderTargets[i] = SwapChain.GetBuffer <ID3D12Resource>(i); _d3d12Device.CreateRenderTargetView(_renderTargets[i], null, rtvHandle); rtvHandle += _rtvDescriptorSize; } } _commandAllocator = _d3d12Device.CreateCommandAllocator(CommandListType.Direct); _commandList = _d3d12Device.CreateCommandList(CommandListType.Direct, _commandAllocator); _commandList.Close(); // Create synchronization objects. _d3d12Fence = _d3d12Device.CreateFence(0); _fenceValue = 1; _fenceEvent = new AutoResetEvent(false); }