Example #1
0
        public void End()
        {
            if (TextureSize == Vector2.Zero)
            {
                return;
            }
            DWRenderTarget.EndDraw();
            MutexD3D10.Release(0);
            MutexD3D11.Acquire(0, 100);
            ShaderResourceView srv            = new ShaderResourceView(DeviceManager.Device, TextureD3D11);
            BlendState         lastBlendState = DeviceManager.Context.OutputMerger.BlendState;

            Viewport[] lastViewports = DeviceManager.Context.Rasterizer.GetViewports();
            //WVP行列をエフェクトに渡す
            SpriteEffect.GetVariableBySemantic("WORLDVIEWPROJECTION")
            .AsMatrix()
            .SetMatrix(ViewMatrix * SpriteProjectionMatrix);
            SpriteEffect.GetVariableBySemantic("SPRITETEXTURE").AsResource().SetResource(srv);
            DeviceManager.Context.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(VertexBuffer, SpriteVertexLayout.SizeInBytes, 0));
            DeviceManager.Context.InputAssembler.InputLayout       = VertexInputLayout;
            DeviceManager.Context.InputAssembler.PrimitiveTopology = PrimitiveTopology.TriangleList;
            DeviceManager.Context.OutputMerger.BlendState          = state;
            DeviceManager.Context.Rasterizer.SetViewports(spriteViewport);
            renderPass.Apply(DeviceManager.Context);
            DeviceManager.Context.Draw(6, 0);
            DeviceManager.Context.Rasterizer.SetViewports(lastViewports);
            DeviceManager.Context.OutputMerger.BlendState = lastBlendState;
            srv.Dispose();
            MutexD3D11.Release(0);
        }
Example #2
0
 public void Dispose()
 {
     if (BatchDisposing != null)
     {
         BatchDisposing(this, new EventArgs());
     }
     if (TextureD3D10 != null && !TextureD3D10.Disposed)
     {
         TextureD3D10.Dispose();
     }
     if (TextureD3D11 != null && !TextureD3D11.Disposed)
     {
         TextureD3D11.Dispose();
     }
     if (MutexD3D10 != null && !MutexD3D10.Disposed)
     {
         MutexD3D10.Dispose();
     }
     if (MutexD3D11 != null && !MutexD3D11.Disposed)
     {
         MutexD3D11.Dispose();
     }
     if (DWRenderTarget != null && !DWRenderTarget.Disposed)
     {
         DWRenderTarget.Dispose();
     }
     if (VertexBuffer != null && !VertexBuffer.Disposed)
     {
         VertexBuffer.Dispose();
     }
     if (VertexInputLayout != null && !VertexInputLayout.Disposed)
     {
         VertexInputLayout.Dispose();
     }
     if (SpriteEffect != null && !SpriteEffect.Disposed)
     {
         SpriteEffect.Dispose();
     }
     if (sampler != null && !sampler.Disposed)
     {
         sampler.Dispose();
     }
     //以下の二つはRenderContextがDisposeされるときに呼ばれないとバグが出る。(画面真っ黒)
     //これは同じ種類のブレンドステートがDisposeされてしまうからだと予測できる。
     //このため、Dispose予定リストに含めておき、RenderContextの破棄時に処理をする
     context.Disposables.Add(TransParentBlendState);
     context.Disposables.Add(state);
 }
Example #3
0
        public void Resize()
        {
            Viewport vp     = DeviceManager.Context.Rasterizer.GetViewports()[0];
            int      width  = (int)vp.Width;
            int      height = (int)vp.Height;

            if (height == 0 || width == 0)
            {
                return;
            }
            TextureSize = new Vector2(width, height);
            float       w = width / 2f, h = height / 2f;
            List <byte> vertexBytes = new List <byte>();

            CGHelper.AddListBuffer(new Vector3(-w, h, 0), vertexBytes);
            CGHelper.AddListBuffer(new Vector2(0, 0), vertexBytes);
            CGHelper.AddListBuffer(new Vector3(w, h, 0), vertexBytes);
            CGHelper.AddListBuffer(new Vector2(1, 0), vertexBytes);
            CGHelper.AddListBuffer(new Vector3(-w, -h, 0), vertexBytes);
            CGHelper.AddListBuffer(new Vector2(0, 1), vertexBytes);
            CGHelper.AddListBuffer(new Vector3(w, h, 0), vertexBytes);
            CGHelper.AddListBuffer(new Vector2(1, 0), vertexBytes);
            CGHelper.AddListBuffer(new Vector3(w, -h, 0), vertexBytes);
            CGHelper.AddListBuffer(new Vector2(1, 1), vertexBytes);
            CGHelper.AddListBuffer(new Vector3(-w, -h, 0), vertexBytes);
            CGHelper.AddListBuffer(new Vector2(0, 1), vertexBytes);
            using (DataStream ds = new DataStream(vertexBytes.ToArray(), true, true))
            {
                BufferDescription bufDesc = new BufferDescription()
                {
                    BindFlags   = BindFlags.VertexBuffer,
                    SizeInBytes = (int)ds.Length
                };
                if (VertexBuffer != null && !VertexBuffer.Disposed)
                {
                    VertexBuffer.Dispose();
                }
                VertexBuffer = new SlimDX.Direct3D11.Buffer(DeviceManager.Device, ds, bufDesc);
            }
            SpriteProjectionMatrix = Matrix.OrthoLH(width, height, 0, 100);
            spriteViewport         = new Viewport()
            {
                Width  = width,
                Height = height,
                MaxZ   = 1
            };


            ViewMatrix = Matrix.LookAtLH(new Vector3(0, 0, -1), new Vector3(0, 0, 0), new Vector3(0, 1, 0));

            //DirectX11用テクスチャの作成
            if (TextureD3D11 != null && !TextureD3D11.Disposed)
            {
                TextureD3D11.Dispose();
            }
            TextureD3D11 = new Texture2D(DeviceManager.Device, new Texture2DDescription()
            {
                Width             = width,
                Height            = height,
                MipLevels         = 1,
                ArraySize         = 1,
                Format            = Format.B8G8R8A8_UNorm,
                SampleDescription = new SampleDescription(1, 0),
                Usage             = ResourceUsage.Default,
                BindFlags         = BindFlags.RenderTarget | BindFlags.ShaderResource,
                CpuAccessFlags    = CpuAccessFlags.None,
                OptionFlags       = ResourceOptionFlags.KeyedMutex
            });
            //DX11のテクスチャリソースをDX10とシェアする
            Resource sharedResource = new Resource(TextureD3D11);

            if (TextureD3D10 != null && !TextureD3D10.Disposed)
            {
                TextureD3D10.Dispose();
            }
            TextureD3D10 = DeviceManager.Device10.OpenSharedResource <SlimDX.Direct3D10.Texture2D>(sharedResource.SharedHandle);
            if (MutexD3D10 != null && !MutexD3D10.Disposed)
            {
                MutexD3D10.Dispose();
            }
            if (MutexD3D11 != null && !MutexD3D11.Disposed)
            {
                MutexD3D11.Dispose();
            }
            MutexD3D10 = new KeyedMutex(TextureD3D10);
            MutexD3D11 = new KeyedMutex(TextureD3D11);
            sharedResource.Dispose();
            Surface surface            = TextureD3D10.AsSurface();
            RenderTargetProperties rtp = new RenderTargetProperties();

            rtp.MinimumFeatureLevel = FeatureLevel.Direct3D10;
            rtp.Type        = RenderTargetType.Hardware;
            rtp.Usage       = RenderTargetUsage.None;
            rtp.PixelFormat = new PixelFormat(Format.Unknown, AlphaMode.Premultiplied);
            if (DWRenderTarget != null && !DWRenderTarget.Disposed)
            {
                DWRenderTarget.Dispose();
            }
            DWRenderTarget = RenderTarget.FromDXGI(context.D2DFactory, surface, rtp);
            surface.Dispose();

            if (RenderTargetRecreated != null)
            {
                RenderTargetRecreated(this, new EventArgs());
            }
        }