private ShaderResourceViewProxy CreateRenderTarget(int width, int height, MSAALevel msaa) { #if MSAA MSAA = msaa; #endif TargetWidth = width; TargetHeight = height; DisposeBuffers(); ColorBufferSampleDesc = GetMSAASampleDescription(); OnCreateRenderTargetAndDepthBuffers(width, height, UseDepthStencilBuffer, out colorBuffer, out depthStencilBuffer); backBuffer = OnCreateBackBuffer(width, height); backBuffer.CreateRenderTargetView(); fullResPPBuffer = Collect(new PingPongColorBuffers(Format, width, height, this.deviceResources)); fullResDepthStencilPool = Collect(new TexturePool(this.deviceResources, new Texture2DDescription() { Width = width, Height = height, ArraySize = 1, BindFlags = BindFlags.DepthStencil, CpuAccessFlags = CpuAccessFlags.None, Usage = ResourceUsage.Default, MipLevels = 1, OptionFlags = ResourceOptionFlags.None, SampleDescription = new SampleDescription(1, 0) })); Initialized = true; OnNewBufferCreated?.Invoke(this, new Texture2DArgs(backBuffer)); return(backBuffer); }
private ShaderResourceViewProxy CreateRenderTarget(int width, int height, MSAALevel msaa) { #if MSAA MSAA = msaa; #endif TargetWidth = width; TargetHeight = height; DisposeBuffers(); ColorBufferSampleDesc = GetMSAASampleDescription(); OnCreateRenderTargetAndDepthBuffers(width, height, UseDepthStencilBuffer, out colorBuffer, out depthStencilBuffer); backBuffer = OnCreateBackBuffer(width, height); backBuffer.CreateRenderTargetView(); Initialized = true; OnNewBufferCreated?.Invoke(this, new Texture2DArgs(backBuffer)); return(backBuffer); }
/// <summary> /// /// </summary> /// <param name="width"></param> /// <param name="height"></param> /// <param name="createDepthStencilBuffer"></param> /// <param name="colorBuffer"></param> /// <param name="depthStencilBuffer"></param> /// <returns></returns> protected virtual void OnCreateRenderTargetAndDepthBuffers(int width, int height, bool createDepthStencilBuffer, out ShaderResourceViewProxy colorBuffer, out ShaderResourceViewProxy depthStencilBuffer) { var sampleDesc = ColorBufferSampleDesc; var optionFlags = ResourceOptionFlags.None; var colordesc = new Texture2DDescription { BindFlags = BindFlags.RenderTarget | BindFlags.ShaderResource, Format = Format.B8G8R8A8_UNorm, Width = width, Height = height, MipLevels = 1, SampleDescription = sampleDesc, Usage = ResourceUsage.Default, OptionFlags = optionFlags, CpuAccessFlags = CpuAccessFlags.None, ArraySize = 1 }; colorBuffer = Collect(new ShaderResourceViewProxy(Device, colordesc)); colorBuffer.CreateRenderTargetView(); colorBuffer.CreateTextureView(); if (createDepthStencilBuffer) { var depthdesc = new Texture2DDescription { BindFlags = BindFlags.DepthStencil, Format = Format.D32_Float_S8X24_UInt, Width = width, Height = height, MipLevels = 1, SampleDescription = sampleDesc, Usage = ResourceUsage.Default, OptionFlags = ResourceOptionFlags.None, CpuAccessFlags = CpuAccessFlags.None, ArraySize = 1, }; depthStencilBuffer = Collect(new ShaderResourceViewProxy(Device, depthdesc)); depthStencilBuffer.CreateDepthStencilView(); } else { depthStencilBuffer = null; } }
private void EnsureTextureResources(int w, int h, DeviceContextProxy deviceContext) { if (w != width || h != height) { RemoveAndDispose(ref ssaoView); width = w; height = h; if (width > 10 && height > 10) { ssaoTextureDesc.Width = width; ssaoTextureDesc.Height = height; ssaoView = new ShaderResourceViewProxy(deviceContext, ssaoTextureDesc); ssaoView.CreateTextureView(); ssaoView.CreateRenderTargetView(); } } }
private bool CreateRenderTargets(int width, int height) { if (currWidth == width || currHeight == height) { return(false); } DisposeAllTargets(); currWidth = width; currHeight = height; var tex2DDesc = new Texture2DDescription() { Width = width, Height = height, ArraySize = 1, MipLevels = 1, SampleDescription = new SampleDescription(1, 0), BindFlags = BindFlags.RenderTarget | BindFlags.ShaderResource, Usage = ResourceUsage.Default, CpuAccessFlags = CpuAccessFlags.None, }; tex2DDesc.Format = Format.R32G32_Float; minMaxZTarget0 = new ShaderResourceViewProxy(Device, tex2DDesc); minMaxZTarget0.CreateRenderTargetView(); minMaxZTarget0.CreateTextureView(); minMaxZTarget1 = new ShaderResourceViewProxy(Device, tex2DDesc); minMaxZTarget1.CreateRenderTargetView(); minMaxZTarget1.CreateTextureView(); minMaxZTargets[0] = minMaxZTarget0; minMaxZTargets[1] = minMaxZTarget1; tex2DDesc.Format = Format.R8G8B8A8_UNorm; frontBlendingTarget = new ShaderResourceViewProxy(Device, tex2DDesc); frontBlendingTarget.CreateRenderTargetView(); frontBlendingTarget.CreateTextureView(); backBlendingTarget = new ShaderResourceViewProxy(Device, tex2DDesc); backBlendingTarget.CreateRenderTargetView(); backBlendingTarget.CreateTextureView(); return(true); }
/// <summary> /// /// </summary> /// <param name="width"></param> /// <param name="height"></param> /// <param name="createDepthStencilBuffer"></param> /// <param name="colorBuffer"></param> /// <param name="depthStencilBuffer"></param> /// <returns></returns> protected virtual void OnCreateRenderTargetAndDepthBuffers(int width, int height, bool createDepthStencilBuffer, out ShaderResourceViewProxy colorBuffer, out ShaderResourceViewProxy depthStencilBuffer) { var sampleDesc = ColorBufferSampleDesc; var optionFlags = ResourceOptionFlags.None; var colordesc = new Texture2DDescription { BindFlags = BindFlags.RenderTarget | BindFlags.ShaderResource, Format = Format, Width = width, Height = height, MipLevels = 1, SampleDescription = sampleDesc, Usage = ResourceUsage.Default, OptionFlags = optionFlags, CpuAccessFlags = CpuAccessFlags.None, ArraySize = 1 }; colorBuffer = new ShaderResourceViewProxy(Device, colordesc); colorBuffer.CreateRenderTargetView(); colorBuffer.CreateTextureView(); if (createDepthStencilBuffer) { var depthdesc = new Texture2DDescription { BindFlags = BindFlags.DepthStencil, Format = DepthStencilFormatHelper.ComputeTextureFormat(Format.D32_Float_S8X24_UInt, out var canUseAsShaderResource), Width = width, Height = height, MipLevels = 1, SampleDescription = sampleDesc, Usage = ResourceUsage.Default, OptionFlags = ResourceOptionFlags.None, CpuAccessFlags = CpuAccessFlags.None, ArraySize = 1, }; canUseAsShaderResource &= !HasMSAA; if (canUseAsShaderResource) { depthdesc.BindFlags |= BindFlags.ShaderResource; } depthStencilBuffer = new ShaderResourceViewProxy(Device, depthdesc); depthStencilBuffer.CreateDepthStencilView( new DepthStencilViewDescription() { Format = DepthStencilFormatHelper.ComputeDSVFormat(depthdesc.Format), Dimension = HasMSAA ? DepthStencilViewDimension.Texture2DMultisampled : DepthStencilViewDimension.Texture2D }); if (canUseAsShaderResource) { depthStencilBuffer.CreateTextureView(new ShaderResourceViewDescription() { Format = DepthStencilFormatHelper.ComputeSRVFormat(depthdesc.Format), Dimension = global::SharpDX.Direct3D.ShaderResourceViewDimension.Texture2D, Texture2D = new ShaderResourceViewDescription.Texture2DResource() { MipLevels = depthdesc.MipLevels } }); } } else { depthStencilBuffer = null; } }
private bool CreateTextureResources(RenderContext context, DeviceContextProxy deviceContext) { var currSampleDesc = context.RenderHost.RenderBuffer.ColorBufferSampleDesc; #if MSAASEPARATE hasMSAA = currSampleDesc.Count > 1 || currSampleDesc.Quality > 0; #endif if (width != (int)context.ActualWidth || height != (int)context.ActualHeight || sampleDesc.Count != currSampleDesc.Count || sampleDesc.Quality != currSampleDesc.Quality) { RemoveAndDispose(ref colorTarget); RemoveAndDispose(ref alphaTarget); RemoveAndDispose(ref colorTargetNoMSAA); RemoveAndDispose(ref alphaTargetNoMSAA); sampleDesc = currSampleDesc; width = (int)context.ActualWidth; height = (int)context.ActualHeight; colorDesc.Width = alphaDesc.Width = width; colorDesc.Height = alphaDesc.Height = height; colorDesc.SampleDescription = alphaDesc.SampleDescription = sampleDesc; #if MSAASEPARATE if (hasMSAA) { colorDesc.BindFlags = alphaDesc.BindFlags = BindFlags.RenderTarget; } else #endif { colorDesc.BindFlags = alphaDesc.BindFlags = BindFlags.RenderTarget | BindFlags.ShaderResource; } colorTarget = Collect(new ShaderResourceViewProxy(Device, colorDesc)); alphaTarget = Collect(new ShaderResourceViewProxy(Device, alphaDesc)); colorTarget.CreateRenderTargetView(); alphaTarget.CreateRenderTargetView(); #if MSAASEPARATE if (!hasMSAA) #endif { alphaTarget.CreateTextureView(); colorTarget.CreateTextureView(); colorTargetNoMSAA = colorTarget; alphaTargetNoMSAA = alphaTarget; } #if MSAASEPARATE else { colorDesc.SampleDescription = alphaDesc.SampleDescription = new SampleDescription(1, 0); colorDesc.BindFlags = alphaDesc.BindFlags = BindFlags.ShaderResource; colorTargetNoMSAA = Collect(new ShaderResourceViewProxy(Device, colorDesc)); alphaTargetNoMSAA = Collect(new ShaderResourceViewProxy(Device, alphaDesc)); colorTargetNoMSAA.CreateTextureView(); alphaTargetNoMSAA.CreateTextureView(); } #endif InvalidateRenderer(); return(true); // Skip this frame if texture resized to reduce latency. } return(false); }