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(); } }
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 }); }