예제 #1
0
 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 });
 }
예제 #2
0
            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);
            }
예제 #3
0
 /// <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);
     }
 }
예제 #4
0
 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);
 }
예제 #5
0
            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);
            }
예제 #6
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);
                }
            }