public override void Render(TimeSpan elapsedTime) { if (elapsedTime == _lastUpdateTime) { return; } var deltaUpdateSeconds = (elapsedTime - _lastUpdateTime).TotalSeconds; var deltaRenderingSeconds = (elapsedTime - _lastRenderingTime).TotalSeconds; _controller.Update(deltaUpdateSeconds); if (deltaRenderingSeconds > 1.0 / _frameRate) { Device.OutputMerger.SetTargets(SampleDepthView, SampleRenderView); Device.Rasterizer.SetViewports(ViewPort); Device.ClearDepthStencilView(SampleDepthView, DepthStencilClearFlags.Depth | DepthStencilClearFlags.Stencil, 1.0f, 0); Device.ClearRenderTargetView(SampleRenderView, _renderer.Background); _controller.Render(deltaRenderingSeconds); Device.Flush(); _lastRenderingTime = elapsedTime; } _lastUpdateTime = elapsedTime; }
protected override void DisposeManaged() { _renderer.Dispose(); if (SharedTexture != null) { SharedTexture.Dispose(); SharedTexture = null; } if (SampleRenderView != null) { SampleRenderView.Dispose(); SampleRenderView = null; } if (SampleDepthView != null) { SampleDepthView.Dispose(); SampleDepthView = null; } if (Device != null) { Device.Dispose(); Device = null; } }
public Direct3DRenderingAdapter(IController controller, Direct3DRenderer renderer, Device device, double frameRate) { if (controller == null) throw new ArgumentNullException("controller"); if (renderer == null) throw new ArgumentNullException("renderer"); if (device == null) throw new ArgumentNullException("device"); _controller = controller; _renderer = renderer; _frameRate = frameRate; Device = device; }
/// <summary> /// Initializes the graphics. /// </summary> public void Initialize() { var descMode = new ModeDescription { Width = _graphicsDevice.BackBuffer.Width, Height = _graphicsDevice.BackBuffer.Height, Format = Format.R8G8B8A8_UNorm, RefreshRate = new Rational(60, 1), Scaling = DisplayModeScaling.Stretched }; var descSwap = new SwapChainDescription { BufferCount = 1, ModeDescription = descMode, Usage = Usage.RenderTargetOutput, OutputHandle = _graphicsDevice.RenderTarget.Handle, SampleDescription = new SampleDescription(1, 0), IsWindowed = true, SwapEffect = SwapEffect.Discard, Flags = SwapChainFlags.None, }; Result creationResult = Device1.CreateWithSwapChain(null, DriverType.Hardware, DeviceCreationFlags.BgraSupport, FeatureLevel.Level_10_0, descSwap, out _direct3D10Device, out _swapChain); if (creationResult.IsFailure) { throw new GraphicsException("DirectX10 is not supported on the current platform."); } SlimDX.DXGI.Surface backBuffer = SlimDX.DXGI.Surface.FromSwapChain(_swapChain, 0); var d2DFactory = new SlimDX.Direct2D.Factory(SlimDX.Direct2D.FactoryType.Multithreaded); RenderTarget renderTarget = RenderTarget.FromDXGI(d2DFactory, backBuffer, new RenderTargetProperties { HorizontalDpi = 96, VerticalDpi = 96, MinimumFeatureLevel = SlimDX.Direct2D.FeatureLevel.Default, PixelFormat = new PixelFormat(Format.R8G8B8A8_UNorm, AlphaMode.Premultiplied), Type = RenderTargetType.Hardware, Usage = RenderTargetUsage.None }); renderTarget.AntialiasMode = SmoothingMode == SmoothingMode.AntiAlias ? AntialiasMode.Aliased : AntialiasMode.PerPrimitive; renderTarget.TextAntialiasMode = TextAntialiasMode.ClearType; _renderTarget = renderTarget; DirectXHelper.RenderTarget = _renderTarget; DirectXHelper.Direct2DFactory = d2DFactory; }
public DeviceContext10_1(DeviceSettings10_1 settings) { m_settings = settings; Direct3DFactory = new Factory1(); /* Create a Direct3D device using our passed settings */ Device = new SlimDX.Direct3D10_1.Device1(Direct3DFactory.GetAdapter(m_settings.AdapterOrdinal), DriverType.Hardware, settings.CreationFlags, FeatureLevel.Level_10_0); /* Create a Direct2D factory while we are at it...*/ Direct2DFactory = new SlimDX.Direct2D.Factory(FactoryType.Multithreaded); MakeBothSidesRendered(); }
public Direct3DRenderingAdapter(IController controller, Direct3DRenderer renderer, Device device, double frameRate) { if (controller == null) { throw new ArgumentNullException("controller"); } if (renderer == null) { throw new ArgumentNullException("renderer"); } if (device == null) { throw new ArgumentNullException("device"); } _controller = controller; _renderer = renderer; _frameRate = frameRate; Device = device; }
/// <summary> /// Constructor is private, because this is a singleton class: /// client controls should use the public AddRef method instead. /// </summary> SlimDXGraphicsDeviceService10() { factoryDXGI = new Factory(); factory2D = new SlimDX.Direct2D.Factory(); // Try to create a hardware device first and fall back to a // software (WARP doens't let us share resources) var device1 = TryCreateDevice1(SlimDX.Direct3D10.DriverType.Hardware); if (device1 == null) { device1 = TryCreateDevice1(SlimDX.Direct3D10.DriverType.Software); if (device1 == null) { throw new SlimDX.Direct3D10.Direct3D10Exception("Unable to create a DirectX 10 device."); } } //this.device = device1.QueryInterface<D3D10.D3DDevice>(); //device1.Dispose(); this.device = device1; }
/// <summary> /// デバイスの初期化処理 /// </summary> /// <param name="control">適用するコントロールへの参照</param> public void Load(bool needDX11 = false, DeviceCreationFlags dx11flag = DeviceCreationFlags.None, SlimDX.Direct3D10.DeviceCreationFlags dx10flag_for2DDraw = SlimDX.Direct3D10.DeviceCreationFlags.BgraSupport) { ApplyDebugFlags(ref dx11flag, ref dx10flag_for2DDraw); Factory = new Factory1(); CurrentAdapter = Factory.GetAdapter1(0); //スワップチェーンの初期化 try { Device = new Device(CurrentAdapter, dx11flag, new[] { FeatureLevel.Level_11_0 }); } catch (Direct3D11Exception) { if (needDX11) { throw new NotSupportedException("DX11がサポートされていません。DX10.1で初期化するにはLoadの第一引数needDraw=falseとして下さい。"); } try { Device = new Device(CurrentAdapter, dx11flag, new[] { FeatureLevel.Level_10_0 }); } catch (Direct3D11Exception) { throw new NotSupportedException("DX11,DX10.1での初期化を試みましたが、両方ともサポートされていません。"); } } DeviceFeatureLevel = Device.FeatureLevel; Context = Device.ImmediateContext; SampleDescription sampleDesc = new SampleDescription(1, 0); #if VSG_DEBUG #else Device10 = new Device1(CurrentAdapter, DriverType.Hardware, dx10flag_for2DDraw, SlimDX.Direct3D10_1.FeatureLevel.Level_9_3); #endif MMEEffectManager.IniatializeMMEEffectManager(this); }
public void Initialize() { D3DDevice10 = new SlimDX.Direct3D10_1.Device1(SlimDX.Direct3D10.DeviceCreationFlags.BgraSupport, SlimDX.Direct3D10_1.FeatureLevel.Level_10_0); WriteFactory = new SlimDX.DirectWrite.Factory(SlimDX.DirectWrite.FactoryType.Shared); D2DFactory = new SlimDX.Direct2D.Factory(SlimDX.Direct2D.FactoryType.SingleThreaded); }
public TextRenderer(Device device) { using (var factory = new SlimDX.DXGI.Factory1()) { using (var adapter = factory.GetAdapter1(0)) { this.device = new SlimDX.Direct3D10_1.Device1( adapter, SlimDX.Direct3D10.DriverType.Hardware, SlimDX.Direct3D10.DeviceCreationFlags.BgraSupport, SlimDX.Direct3D10_1.FeatureLevel.Level_10_0 ); // Create the DirectX11 texture2D. This texture will be shared with the DirectX10 // device. The DirectX10 device will be used to render text onto this texture. DirectX11 // will then draw this texture (blended) onto the screen. // The KeyedMutex flag is required in order to share this resource. textureD3D11 = new SlimDX.Direct3D11.Texture2D(device.Handle, new SlimDX.Direct3D11.Texture2DDescription { Width = device.Form.Width, Height = device.Form.Height, MipLevels = 1, ArraySize = 1, Format = SlimDX.DXGI.Format.B8G8R8A8_UNorm, SampleDescription = new SlimDX.DXGI.SampleDescription(1, 0), Usage = SlimDX.Direct3D11.ResourceUsage.Default, BindFlags = SlimDX.Direct3D11.BindFlags.RenderTarget | SlimDX.Direct3D11.BindFlags.ShaderResource, CpuAccessFlags = SlimDX.Direct3D11.CpuAccessFlags.None, OptionFlags = SlimDX.Direct3D11.ResourceOptionFlags.KeyedMutex }); // A DirectX10 Texture2D sharing the DirectX11 Texture2D var sharedResource = new SlimDX.DXGI.Resource(textureD3D11); var textureD3D10 = this.device.OpenSharedResource<SlimDX.Direct3D10.Texture2D>(sharedResource.SharedHandle); // The KeyedMutex is used just prior to writing to textureD3D11 or textureD3D10. // This is how DirectX knows which DirectX (10 or 11) is supposed to be writing // to the shared texture. The keyedMutex is just defined here, they will be used // a bit later. mutex10 = new SlimDX.DXGI.KeyedMutex(textureD3D10); mutex11 = new SlimDX.DXGI.KeyedMutex(textureD3D11); // Direct2D Factory SlimDX.Direct2D.Factory d2Factory = new SlimDX.Direct2D.Factory( SlimDX.Direct2D.FactoryType.SingleThreaded, SlimDX.Direct2D.DebugLevel.Information ); // Direct Write factory SlimDX.DirectWrite.Factory dwFactory = new SlimDX.DirectWrite.Factory( SlimDX.DirectWrite.FactoryType.Isolated ); // The textFormat we will use to draw text with textFormat = new SlimDX.DirectWrite.TextFormat( dwFactory, "Arial", SlimDX.DirectWrite.FontWeight.Normal, SlimDX.DirectWrite.FontStyle.Normal, SlimDX.DirectWrite.FontStretch.Normal, 24, "en-US" ); textFormat.TextAlignment = SlimDX.DirectWrite.TextAlignment.Center; textFormat.ParagraphAlignment = SlimDX.DirectWrite.ParagraphAlignment.Center; // Query for a IDXGISurface. // DirectWrite and DirectX10 can interoperate thru DXGI. var surface = textureD3D10.AsSurface(); var rtp = new SlimDX.Direct2D.RenderTargetProperties(); rtp.MinimumFeatureLevel = SlimDX.Direct2D.FeatureLevel.Direct3D10; rtp.Type = SlimDX.Direct2D.RenderTargetType.Hardware; rtp.Usage = SlimDX.Direct2D.RenderTargetUsage.None; rtp.PixelFormat = new SlimDX.Direct2D.PixelFormat(SlimDX.DXGI.Format.Unknown, SlimDX.Direct2D.AlphaMode.Premultiplied); dwRenderTarget = SlimDX.Direct2D.RenderTarget.FromDXGI(d2Factory, surface, rtp); // Brush used to DrawText brushSolidWhite = new SlimDX.Direct2D.SolidColorBrush( dwRenderTarget, new SlimDX.Color4(1, 1, 1, 1) ); // Think of the shared textureD3D10 as an overlay. // The overlay needs to show the text but let the underlying triangle (or whatever) // show thru, which is accomplished by blending. var bsd = new SlimDX.Direct3D11.BlendStateDescription(); bsd.RenderTargets[0].BlendEnable = true; bsd.RenderTargets[0].SourceBlend = SlimDX.Direct3D11.BlendOption.SourceAlpha; bsd.RenderTargets[0].DestinationBlend = SlimDX.Direct3D11.BlendOption.InverseSourceAlpha; bsd.RenderTargets[0].BlendOperation = SlimDX.Direct3D11.BlendOperation.Add; bsd.RenderTargets[0].SourceBlendAlpha = SlimDX.Direct3D11.BlendOption.One; bsd.RenderTargets[0].DestinationBlendAlpha = SlimDX.Direct3D11.BlendOption.Zero; bsd.RenderTargets[0].BlendOperationAlpha = SlimDX.Direct3D11.BlendOperation.Add; bsd.RenderTargets[0].RenderTargetWriteMask = SlimDX.Direct3D11.ColorWriteMaskFlags.All; BlendState_Transparent = SlimDX.Direct3D11.BlendState.FromDescription(device.Handle, bsd); // Load Effect. This includes both the vertex and pixel shaders. // Also can include more than one technique. var shaderByteCode = SlimDX.D3DCompiler.ShaderBytecode.CompileFromFile( "texteffect.fx", "fx_5_0", SlimDX.D3DCompiler.ShaderFlags.EnableStrictness, SlimDX.D3DCompiler.EffectFlags.None); effect = new SlimDX.Direct3D11.Effect(device.Handle, shaderByteCode); // create triangle vertex data, making sure to rewind the stream afterward var verticesTriangle = new SlimDX.DataStream(30 * 3, true, true); verticesTriangle.Write(new SlimDX.Vector3(0.0f, 0.5f, 0.5f)); verticesTriangle.Write(new SlimDX.Color4(1.0f, 0.0f, 0.0f, 1.0f)); verticesTriangle.Write(new SlimDX.Vector3(0.5f, -0.5f, 0.5f)); verticesTriangle.Write(new SlimDX.Color4(0.0f, 1.0f, 0.0f, 1.0f)); verticesTriangle.Write(new SlimDX.Vector3(-0.5f, -0.5f, 0.5f)); verticesTriangle.Write(new SlimDX.Color4(0.0f, 0.0f, 1.0f, 1.0f)); verticesTriangle.Position = 0; // create the triangle vertex layout and buffer var inputElements = new SlimDX.Direct3D11.InputElement[] { new SlimDX.Direct3D11.InputElement("POSITION", 0, SlimDX.DXGI.Format.R32G32B32A32_Float, 0, 0), new SlimDX.Direct3D11.InputElement("COLOR",0,SlimDX.DXGI.Format.R32G32B32A32_Float,16,0) }; var layoutColor = new SlimDX.Direct3D11.InputLayout(device.Handle, effect.GetTechniqueByName("Color").GetPassByIndex(0).Description.Signature, inputElements); var vertexBufferColor = new SlimDX.Direct3D11.Buffer(device.Handle, verticesTriangle, (int)verticesTriangle.Length, SlimDX.Direct3D11.ResourceUsage.Default, SlimDX.Direct3D11.BindFlags.VertexBuffer, SlimDX.Direct3D11.CpuAccessFlags.None, SlimDX.Direct3D11.ResourceOptionFlags.None, 0); verticesTriangle.Close(); // create text vertex data, making sure to rewind the stream afterward // Top Left of screen is -1, +1 // Bottom Right of screen is +1, -1 var verticesText = new SlimDX.DataStream(30 * 4, true, true); verticesText.Write(new SlimDX.Vector3(-1, 1, 0)); verticesText.Write(new SlimDX.Vector2(0, 0f)); verticesText.Write(new SlimDX.Vector3(1, 1, 0)); verticesText.Write(new SlimDX.Vector2(1, 0)); verticesText.Write(new SlimDX.Vector3(-1, -1, 0)); verticesText.Write(new SlimDX.Vector2(0, 1)); verticesText.Write(new SlimDX.Vector3(1, -1, 0)); verticesText.Write(new SlimDX.Vector2(1, 1)); verticesText.Position = 0; // create the text vertex layout and buffer layoutText = new SlimDX.Direct3D11.InputLayout(device.Handle, effect.GetTechniqueByName("Text").GetPassByIndex(0).Description.Signature, inputElements); vertexBufferText = new SlimDX.Direct3D11.Buffer(device.Handle, verticesText, (int)verticesText.Length, SlimDX.Direct3D11.ResourceUsage.Default, SlimDX.Direct3D11.BindFlags.VertexBuffer, SlimDX.Direct3D11.CpuAccessFlags.None, SlimDX.Direct3D11.ResourceOptionFlags.None, 0); verticesText.Close(); } } }
public void Dispose() { if (device != null) { device.Dispose(); device = null; } }