Пример #1
0
        protected override void OnRender(RenderContext context, DeviceContextProxy deviceContext)
        {
            if (context.IsShadowPass)
            {
                return;
            }
            OnUpdateLightSource?.Invoke(this, new UpdateLightSourceEventArgs(context));
            ++currentFrame;
            currentFrame %= Math.Max(1, UpdateFrequency);
            if (!FoundLightSource || currentFrame != 0)
            {
                return;
            }
            if (resolutionChanged)
            {
                RemoveAndDispose(ref viewResource);
                viewResource = Collect(new ShaderResourceViewProxy(Device, ShadowMapTextureDesc));
                viewResource.CreateView(DepthStencilViewDesc);
                viewResource.CreateView(ShaderResourceViewDesc);
                resolutionChanged = false;
            }

            deviceContext.ClearDepthStencilView(viewResource, DepthStencilClearFlags.Depth, 1.0f, 0);
            context.IsShadowPass = true;
            var orgFrustum = context.BoundingFrustum;
            var frustum    = new BoundingFrustum(LightViewProjectMatrix);

            context.BoundingFrustum = frustum;
#if !TEST
            deviceContext.SetViewport(0, 0, Width, Height);

            deviceContext.SetDepthStencilOnly(viewResource.DepthStencilView);
            for (int i = 0; i < context.RenderHost.PerFrameOpaqueNodes.Count; ++i)
            {
                //Only support opaque object for throwing shadows.
                var core = context.RenderHost.PerFrameOpaqueNodes[i];
                if (core.RenderCore.IsThrowingShadow && core.TestViewFrustum(ref frustum))
                {
                    core.Render(context, deviceContext);
                }
            }

            context.IsShadowPass    = false;
            context.BoundingFrustum = orgFrustum;
            context.RenderHost.SetDefaultRenderTargets(false);
            context.SharedResource.ShadowView = viewResource;
#endif
        }
Пример #2
0
            protected override void OnRender(RenderContext renderContext, DeviceContextProxy deviceContext)
            {
                if (needsAssignVariables)
                {
                    lock (clipParamCB)
                    {
                        if (needsAssignVariables)
                        {
                            clipParamCB.WriteValueByName(ClipPlaneStruct.CuttingOperationStr, (int)cuttingOperation);
                            clipParamCB.WriteValueByName(ClipPlaneStruct.CrossSectionColorStr, sectionColor);
                            clipParamCB.WriteValueByName(ClipPlaneStruct.EnableCrossPlaneStr, planeEnabled);
                            clipParamCB.WriteValueByName(ClipPlaneStruct.EnableCrossPlane5To8Str, plane5To8Enabled);
                            clipParamCB.WriteValueByName(ClipPlaneStruct.CrossPlane1ParamsStr, plane1Params);
                            clipParamCB.WriteValueByName(ClipPlaneStruct.CrossPlane2ParamsStr, plane2Params);
                            clipParamCB.WriteValueByName(ClipPlaneStruct.CrossPlane3ParamsStr, plane3Params);
                            clipParamCB.WriteValueByName(ClipPlaneStruct.CrossPlane4ParamsStr, plane4Params);
                            clipParamCB.WriteValueByName(ClipPlaneStruct.CrossPlane5ParamsStr, plane5Params);
                            clipParamCB.WriteValueByName(ClipPlaneStruct.CrossPlane6ParamsStr, plane6Params);
                            clipParamCB.WriteValueByName(ClipPlaneStruct.CrossPlane7ParamsStr, plane7Params);
                            clipParamCB.WriteValueByName(ClipPlaneStruct.CrossPlane8ParamsStr, plane8Params);
                            needsAssignVariables = false;
                        }
                    }
                }
                clipParamCB.Upload(deviceContext);
                base.OnRender(renderContext, deviceContext);
                // Draw backface into stencil buffer
                var dsView = renderContext.RenderHost.DepthStencilBufferView;

                deviceContext.ClearDepthStencilView(dsView, DepthStencilClearFlags.Stencil, 0, 0);
                deviceContext.SetDepthStencilOnly(dsView);//Remove render target
                deviceContext.SetRasterState(backfaceRasterState);
                drawBackfacePass.BindShader(deviceContext);
                drawBackfacePass.BindStates(deviceContext, StateType.BlendState | StateType.DepthStencilState);
                DrawIndexed(deviceContext, GeometryBuffer.IndexBuffer, InstanceBuffer);

                //Draw full screen quad to fill cross section
                deviceContext.SetRasterState(RasterState);
                drawScreenQuadPass.BindShader(deviceContext);
                drawScreenQuadPass.BindStates(deviceContext, StateType.BlendState | StateType.DepthStencilState);
                renderContext.RenderHost.SetDefaultRenderTargets(false);//Rebind render target
                deviceContext.Draw(4, 0);
            }
        protected override void OnRender(RenderContext renderContext, DeviceContextProxy deviceContext)
        {
            base.OnRender(renderContext, deviceContext);
            // Draw backface into stencil buffer
            var dsView = renderContext.RenderHost.DepthStencilBufferView;

            deviceContext.ClearDepthStencilView(dsView, DepthStencilClearFlags.Stencil, 0, 0);
            deviceContext.SetDepthStencilOnly(dsView);//Remove render target
            deviceContext.SetRasterState(backfaceRasterState);
            drawBackfacePass.BindShader(deviceContext);
            drawBackfacePass.BindStates(deviceContext, StateType.BlendState | StateType.DepthStencilState);
            OnDraw(deviceContext, InstanceBuffer);

            //Draw full screen quad to fill cross section
            deviceContext.SetRasterState(RasterState);
            drawScreenQuadPass.BindShader(deviceContext);
            drawScreenQuadPass.BindStates(deviceContext, StateType.BlendState | StateType.DepthStencilState);
            renderContext.RenderHost.SetDefaultRenderTargets(false);//Rebind render target
            deviceContext.Draw(4, 0);
        }