private void Bind(RenderContext context, DeviceContextProxy deviceContext) { targets = deviceContext.GetRenderTargets(2); deviceContext.ClearRenderTargetView(colorTarget, Color.Zero); deviceContext.ClearRenderTargetView(alphaTarget, Color.White); deviceContext.SetRenderTargets(context.RenderHost.DepthStencilBufferView, new RenderTargetView[] { colorTarget, alphaTarget }); }
private void InitializeMinMaxRenderTarget(DeviceContextProxy deviceContext) { var color = new Color4(0, 0, 0, 1); deviceContext.ClearRenderTargetView(frontBlendingTarget, color); color = new Color4(0, 0, 0, 0); deviceContext.ClearRenderTargetView(backBlendingTarget, color); color = new Color4(-1, -1, 0, 0); deviceContext.ClearRenderTargetView(minMaxZTargets[0], color); }
/// <summary> /// Clears the targets. /// </summary> /// <param name="context">The context.</param> /// <param name="c">The c.</param> public void ClearTargets(DeviceContextProxy context, Color c) { foreach (var target in renderTargetBlur) { context.ClearRenderTargetView(target, c); } }
private static void BindTarget(DepthStencilView dsv, RenderTargetView targetView, DeviceContextProxy context, int width, int height, bool clear = true) { if (clear) { context.ClearRenderTargetView(targetView, global::SharpDX.Color.Transparent); } context.SetRenderTargets(dsv, targetView == null ? null : new RenderTargetView[] { targetView }); context.SetViewport(0, 0, width, height); context.SetScissorRectangle(0, 0, width, height); }
public override void Render(RenderContext context, DeviceContextProxy deviceContext) { if (CreateRenderTargets((int)context.ActualWidth, (int)context.ActualHeight)) { RaiseInvalidateRender(); return; } var buffer = context.RenderHost.RenderBuffer; var hasMSAA = buffer.ColorBufferSampleDesc.Count > 1; var nonMSAADepthBuffer = hasMSAA ? context.RenderHost.RenderBuffer.DepthStencilBufferNoMSAA : null; var depthStencilView = hasMSAA ? nonMSAADepthBuffer : ExternRenderParameter.DepthStencilView; RenderCount = 0; InitializeMinMaxRenderTarget(deviceContext); context.OITRenderStage = OITRenderStage.DepthPeelingInitMinMaxZ; deviceContext.SetRenderTarget(depthStencilView, minMaxZTargets[0]); DrawMesh(context, deviceContext); context.OITRenderStage = OITRenderStage.DepthPeeling; var currId = 0; for (var layer = 1; layer < PeelingIteration; ++layer) { currId = layer % 2; var prevId = 1 - currId; var color = new Color4(-1, -1, 0, 0); deviceContext.ClearRenderTargetView(minMaxZTargets[currId], color); targets[0] = minMaxZTargets[currId]; targets[1] = frontBlendingTarget; targets[2] = backBlendingTarget; deviceContext.SetRenderTargets(depthStencilView, targets); deviceContext.SetShaderResource(new PixelShaderType(), 100, minMaxZTargets[prevId]); DrawMesh(context, deviceContext); deviceContext.SetShaderResource(new PixelShaderType(), 100, null); } context.OITRenderStage = OITRenderStage.None; finalSRVs[0] = minMaxZTargets[currId]; finalSRVs[1] = frontBlendingTarget; finalSRVs[2] = backBlendingTarget; finalPass.BindShader(deviceContext); finalPass.BindStates(deviceContext, StateType.All); deviceContext.SetRenderTargets(null, ExternRenderParameter.RenderTargetView); deviceContext.SetShaderResources(new PixelShaderType(), 100, finalSRVs); deviceContext.Draw(4, 0); }
public override void Render(RenderContext context, DeviceContextProxy deviceContext) { using (var back = context.GetOffScreenRT(OffScreenTextureSize.Full, global::SharpDX.DXGI.Format.R16G16B16A16_Float)) { var slot = 0; using (var depth = context.GetOffScreenDS(OffScreenTextureSize.Full, global::SharpDX.DXGI.Format.D32_Float_S8X24_UInt)) { deviceContext.ClearDepthStencilView(depth, DepthStencilClearFlags.Depth | DepthStencilClearFlags.Stencil, 1, 1); deviceContext.ClearRenderTargetView(back, new Color4(0, 0, 0, 0)); BindTarget(depth, back, deviceContext, (int)context.ActualWidth, (int)context.ActualHeight); #region Render box back face and set stencil buffer to 0 modelMatrices.Update(ref ModelMatrix); if (!materialVariables.UpdateMaterialStruct(deviceContext, ref modelMatrices)) { return; } buffer.AttachBuffers(deviceContext, ref slot, EffectTechnique.EffectsManager); cubeBackPass.BindShader(deviceContext); cubeBackPass.BindStates(deviceContext, StateType.All); deviceContext.DrawIndexed(buffer.IndexBuffer.ElementCount, 0, 0); #endregion #region Render all mesh Positions onto off-screen texture region with stencil = 0 only if (context.RenderHost.PerFrameOpaqueNodesInFrustum.Count > 0) { for (var i = 0; i < context.RenderHost.PerFrameOpaqueNodesInFrustum.Count; ++i) { var mesh = context.RenderHost.PerFrameOpaqueNodesInFrustum[i]; var meshPass = mesh.EffectTechnique[DefaultPassNames.Positions]; if (meshPass.IsNULL) { continue; } meshPass.BindShader(deviceContext); meshPass.BindStates(deviceContext, StateType.BlendState); // Set special depth stencil state to only render into region with stencil region is 0 meshFrontPass.BindStates(deviceContext, StateType.DepthStencilState); mesh.RenderCustom(context, deviceContext); } } #endregion } #region Render box back face again and do actual volume sampling context.RenderHost.SetDefaultRenderTargets(false); var pass = materialVariables.GetPass(RenderType.Opaque, context); if (pass != volumePass) { volumePass = pass; backTexSlot = volumePass.PixelShader.ShaderResourceViewMapping.TryGetBindSlot(DefaultBufferNames.VolumeBack); } slot = 0; buffer.AttachBuffers(deviceContext, ref slot, EffectTechnique.EffectsManager); materialVariables.BindMaterialResources(context, deviceContext, pass); volumePass.PixelShader.BindTexture(deviceContext, backTexSlot, back); volumePass.BindShader(deviceContext); volumePass.BindStates(deviceContext, StateType.All); deviceContext.DrawIndexed(buffer.IndexBuffer.ElementCount, 0, 0); #endregion volumePass.PixelShader.BindTexture(deviceContext, backTexSlot, null); } }