コード例 #1
0
        public void SetRenderTargetDX10(SharpDX.Direct3D10.Texture2D renderTarget)
        {
            if (this.RenderTarget != null)
            {
                this.RenderTarget = null;

                base.Lock();
                base.SetBackBuffer(D3DResourceType.IDirect3DSurface9, IntPtr.Zero);
                base.Unlock();
            }

            if (renderTarget == null)
            {
                return;
            }

            if (!IsShareable(renderTarget))
            {
                throw new ArgumentException("Texture must be created with ResourceOptionFlags.Shared");
            }

            Format format = DX10ImageSource.TranslateFormat(renderTarget);

            if (format == Format.Unknown)
            {
                throw new ArgumentException("Texture format is not compatible with OpenSharedResource");
            }

            IntPtr handle = GetSharedHandle(renderTarget);

            if (handle == IntPtr.Zero)
            {
                throw new ArgumentNullException("Handle");
            }

            this.RenderTarget = new Texture(DX10ImageSource.D3DDevice, renderTarget.Description.Width, renderTarget.Description.Height, 1, Usage.RenderTarget, format, Pool.Default, ref handle);
            using (Surface surface = this.RenderTarget.GetSurfaceLevel(0))
            {
                base.Lock();
                base.SetBackBuffer(D3DResourceType.IDirect3DSurface9, surface.NativePointer);
                base.Unlock();
            }
        }
コード例 #2
0
        private void StartD3D()
        {
            this.Device = new Device(DriverType.Hardware, DeviceCreationFlags.BgraSupport, FeatureLevel.Level_10_0);

            this.D3DSurface = new DX10ImageSource();
            this.D3DSurface.IsFrontBufferAvailableChanged += OnIsFrontBufferAvailableChanged;

            this.CreateAndBindTargets();

            this.Source = this.D3DSurface;
            try
            {
                ShaderBytecode shaderBytes = ShaderBytecode.CompileFromFile("Shaders\\Bloom.fx", "fx_4_0", ShaderFlags.None, EffectFlags.None, null, null);
                this.BloomEffect = new Effect(Device, shaderBytes);
            }
            catch
            { }

            EffectTechnique technique = this.BloomEffect.GetTechniqueByIndex(0);
            EffectPass      pass      = technique.GetPassByIndex(0);

            this.VertexLayout = new InputLayout(Device, pass.Description.Signature, new[] {
                new InputElement("POSITION", 0, Format.R32G32B32A32_Float, 0, 0),
                new InputElement("TEXCOORD", 0, Format.R32G32_Float, 16, 0)
            });

            DataStream vertices = new DataStream(4 * 6 * 4, true, true);

            vertices.Write(new Vector4(-1.0f, 1.0f, 0.0f, 1.0f));
            vertices.Write(new Vector2(0.0f, 0.0f));
            vertices.Write(new Vector4(1.0f, 1.0f, 0.0f, 1.0f));
            vertices.Write(new Vector2(1.0f, 0.0f));
            vertices.Write(new Vector4(-1.0f, -1.0f, 0.0f, 1.0f));
            vertices.Write(new Vector2(0.0f, 1.0f));
            vertices.Write(new Vector4(1.0f, -1.0f, 0.0f, 1.0f));
            vertices.Write(new Vector2(1.0f, 1.0f));
            vertices.Position = 0;

            this.QuadBuffer = new Buffer(Device, vertices, new BufferDescription()
            {
                BindFlags      = BindFlags.VertexBuffer,
                CpuAccessFlags = CpuAccessFlags.None,
                OptionFlags    = ResourceOptionFlags.None,
                SizeInBytes    = 4 * 6 * 4,
                Usage          = ResourceUsage.Default
            });

            vertices = new DataStream(4 * 6 * 4, true, true);
            vertices.Write(new Vector4(-1.0f, 1.0f, 0.0f, 1.0f));
            vertices.Write(new Vector2(0.0f, 0.0f));

            vertices.Write(new Vector4(1.0f, 1.0f, 0.0f, 1.0f));
            vertices.Write(new Vector2(2.0f, 0.0f));

            vertices.Write(new Vector4(-1.0f, -1.0f, 0.0f, 1.0f));
            vertices.Write(new Vector2(0.0f, 2.0f));

            vertices.Write(new Vector4(1.0f, -1.0f, 0.0f, 1.0f));
            vertices.Write(new Vector2(2.0f, 2.0f));
            vertices.Position = 0;

            this.HalfQuadBuffer = new Buffer(Device, vertices, new BufferDescription()
            {
                BindFlags      = BindFlags.VertexBuffer,
                CpuAccessFlags = CpuAccessFlags.None,
                OptionFlags    = ResourceOptionFlags.None,
                SizeInBytes    = 4 * 6 * 4,
                Usage          = ResourceUsage.Default
            });
        }