Ejemplo n.º 1
0
            public override void Render(RenderContext context, DeviceContextProxy deviceContext)
            {
                if (!NeedRender)
                {
                    modelStruct.HasShadowMap = 0;
                    modelCB.Upload(deviceContext, ref modelStruct);
                    return;
                }
                OnUpdateLightSource?.Invoke(this, new UpdateLightSourceEventArgs(context));
                ++currentFrame;
                currentFrame %= Math.Max(1, UpdateFrequency);
                if (!FoundLightSource || currentFrame != 0)
                {
                    return;
                }
                if (resolutionChanged)
                {
                    RemoveAndDispose(ref viewResource);
                    viewResource = new ShaderResourceViewProxy(Device, ShadowMapTextureDesc);
                    viewResource.CreateView(DepthStencilViewDesc);
                    viewResource.CreateView(ShaderResourceViewDesc);
                    resolutionChanged = false;
                }

                deviceContext.ClearDepthStencilView(viewResource, DepthStencilClearFlags.Depth, 1.0f, 0);
                var orgFrustum = context.BoundingFrustum;
                var frustum    = new BoundingFrustum(LightView * LightProjection);

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

                deviceContext.SetDepthStencil(viewResource.DepthStencilView);
                modelStruct.HasShadowMap = context.RenderHost.IsShadowMapEnabled ? 1 : 0;
                modelCB.Upload(deviceContext, ref modelStruct);
                for (var 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.RenderShadow(context, deviceContext);
                    }
                }
                context.BoundingFrustum = orgFrustum;
                context.RenderHost.SetDefaultRenderTargets(false);
                context.SharedResource.ShadowView = viewResource;
#endif
            }
            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.SetDepthStencil(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);
            }