/// <summary> /// デバイスを初期化します. /// </summary> public new void Load() { base.Load(false, D3D.DeviceCreationFlags.BgraSupport, DeviceCreationFlags.BgraSupport); //ラスタライザの設定を上書き var blendDesc = new D3D.BlendStateDescription(); blendDesc.AlphaToCoverageEnable = true; // Alpha to Coverage を有効にする blendDesc.IndependentBlendEnable = false; for (int i = 0; i < blendDesc.RenderTargets.Length; i++) { blendDesc.RenderTargets[i].BlendEnable = true; blendDesc.RenderTargets[i].SourceBlend = D3D.BlendOption.SourceAlpha; blendDesc.RenderTargets[i].DestinationBlend = D3D.BlendOption.InverseSourceAlpha; blendDesc.RenderTargets[i].BlendOperation = D3D.BlendOperation.Add; blendDesc.RenderTargets[i].SourceBlendAlpha = D3D.BlendOption.One; blendDesc.RenderTargets[i].DestinationBlendAlpha = D3D.BlendOption.One; // ここを1にしないとアルファの合成が変 blendDesc.RenderTargets[i].BlendOperationAlpha = D3D.BlendOperation.Add; blendDesc.RenderTargets[i].RenderTargetWriteMask = D3D.ColorWriteMaskFlags.All; } customBlendState = Context.OutputMerger.BlendState = D3D.BlendState.FromDescription(Device, blendDesc); d2dFactory = new D2D.Factory(D2D.FactoryType.Multithreaded); dwFactory = new DW.Factory(DW.FactoryType.Shared); }
protected void Render() { while (true) { Timer.Instance.Tick(); if (Resize) { DeviceManager.Instance.Resize(); Resize = false; } frameCounter.Count(); DeviceManager deviceManager = DeviceManager.Instance; deviceManager.context.ClearDepthStencilView(deviceManager.depthStencil, DepthStencilClearFlags.Depth | DepthStencilClearFlags.Stencil, 1.0f, 0); deviceManager.context.ClearRenderTargetView(deviceManager.renderTarget, new Color4(BackgroundColour)); CameraManager.Instance.UpdateFrameCamera(); SlimDX.Direct3D11.DepthStencilState oldDSState = DeviceManager.Instance.context.OutputMerger.DepthStencilState; SlimDX.Direct3D11.BlendState oldBlendState = DeviceManager.Instance.context.OutputMerger.BlendState; SlimDX.Direct3D11.RasterizerState oldRasterizerState = DeviceManager.Instance.context.Rasterizer.State; SlimDX.Direct3D11.VertexShader oldVertexShader = DeviceManager.Instance.context.VertexShader.Get(); SlimDX.Direct3D11.Buffer[] oldVSCBuffers = DeviceManager.Instance.context.VertexShader.GetConstantBuffers(0, 10); SlimDX.Direct3D11.PixelShader oldPixelShader = DeviceManager.Instance.context.PixelShader.Get(); SlimDX.Direct3D11.Buffer[] oldPSCBuffers = DeviceManager.Instance.context.PixelShader.GetConstantBuffers(0, 10); SlimDX.Direct3D11.ShaderResourceView[] oldShaderResources = DeviceManager.Instance.context.PixelShader.GetShaderResources(0, 10); SlimDX.Direct3D11.GeometryShader oldGeometryShader = DeviceManager.Instance.context.GeometryShader.Get(); if (ViewMode == ViewMode.Scene) { if (CurrentScene != null) { CurrentScene.Render(); } } else if (ViewMode == ViewMode.Object) { if (CurrentObject != null) { CurrentObject.Render(); } } DeviceManager.Instance.context.OutputMerger.DepthStencilState = oldDSState; DeviceManager.Instance.context.OutputMerger.BlendState = oldBlendState; DeviceManager.Instance.context.Rasterizer.State = oldRasterizerState; DeviceManager.Instance.context.VertexShader.Set(oldVertexShader); DeviceManager.Instance.context.VertexShader.SetConstantBuffers(oldVSCBuffers, 0, 10); DeviceManager.Instance.context.PixelShader.Set(oldPixelShader); DeviceManager.Instance.context.PixelShader.SetConstantBuffers(oldPSCBuffers, 0, 10); DeviceManager.Instance.context.PixelShader.SetShaderResources(oldShaderResources, 0, 10); DeviceManager.Instance.context.GeometryShader.Set(oldGeometryShader); Monitor.Enter(DeviceManager.Instance.device); _spriteRenderer.RefreshViewport(); _spriteRenderer.Flush(); Monitor.Exit(DeviceManager.Instance.device); DeviceManager.Instance.context.OutputMerger.DepthStencilState = oldDSState; DeviceManager.Instance.context.OutputMerger.BlendState = oldBlendState; DeviceManager.Instance.context.Rasterizer.State = oldRasterizerState; DeviceManager.Instance.context.VertexShader.Set(oldVertexShader); DeviceManager.Instance.context.VertexShader.SetConstantBuffers(oldVSCBuffers, 0, 10); DeviceManager.Instance.context.PixelShader.Set(oldPixelShader); DeviceManager.Instance.context.PixelShader.SetConstantBuffers(oldPSCBuffers, 0, 10); DeviceManager.Instance.context.PixelShader.SetShaderResources(oldShaderResources, 0, 10); DeviceManager.Instance.context.GeometryShader.Set(oldGeometryShader); // syncInterval can be 0 deviceManager.swapChain.Present(syncInterval, PresentFlags.None); } }