/// <summary> /// /// </summary> /// <param name="context"></param> internal void RenderShadowMapCascade(ShadowContext shadowRenderCtxt, IEnumerable <MeshInstance> instances) { using (new PixEvent("ShadowMap")) { if (surfaceShader == null) { return; } var device = Game.GraphicsDevice; var cbData = new CBMeshInstanceData(); var viewPosition = Matrix.Invert(shadowRenderCtxt.ShadowView).TranslationVector; device.SetTargets(shadowRenderCtxt.DepthBuffer, shadowRenderCtxt.ColorBuffer); device.SetViewport(shadowRenderCtxt.ShadowViewport); device.PixelShaderConstants[0] = constBuffer; device.VertexShaderConstants[0] = constBuffer; device.PixelShaderSamplers[0] = SamplerState.AnisotropicWrap; device.PixelShaderConstants[1] = constBufferSubset; cbData.Projection = shadowRenderCtxt.ShadowProjection; cbData.View = shadowRenderCtxt.ShadowView; cbData.ViewPos = new Vector4(viewPosition, 1); cbData.BiasSlopeFar = new Vector4(shadowRenderCtxt.DepthBias, shadowRenderCtxt.SlopeBias, shadowRenderCtxt.FarDistance, 0); //#warning INSTANSING! foreach (var instance in instances) { if (!instance.Visible) { continue; } device.PipelineState = factory[(int)ApplyFlags(instance, SurfaceFlags.SHADOW)]; cbData.World = instance.World; cbData.Color = instance.Color; constBuffer.SetData(cbData); if (instance.IsSkinned) { constBufferBones.SetData(instance.BoneTransforms); device.VertexShaderConstants[3] = constBufferBones; } device.SetupVertexInput(instance.vb, instance.ib); device.DrawIndexed(instance.indexCount, 0, 0); rs.Counters.ShadowDIPs++; } } }
/// <summary> /// /// </summary> /// <param name="context"></param> internal void RenderShadowMapCascade ( ShadowContext shadowRenderCtxt, IEnumerable<MeshInstance> instances ) { using ( new PixEvent("ShadowMap") ) { if (surfaceShader==null) { return; } var device = Game.GraphicsDevice; var cbData = new CBMeshInstanceData(); var viewPosition = Matrix.Invert( shadowRenderCtxt.ShadowView ).TranslationVector; device.SetTargets( shadowRenderCtxt.DepthBuffer, shadowRenderCtxt.ColorBuffer ); device.SetViewport( shadowRenderCtxt.ShadowViewport ); device.PixelShaderConstants[0] = constBuffer ; device.VertexShaderConstants[0] = constBuffer ; device.PixelShaderSamplers[0] = SamplerState.AnisotropicWrap ; cbData.Projection = shadowRenderCtxt.ShadowProjection; cbData.View = shadowRenderCtxt.ShadowView; cbData.ViewPos = new Vector4( viewPosition, 1 ); cbData.BiasSlopeFar = new Vector4( shadowRenderCtxt.DepthBias, shadowRenderCtxt.SlopeBias, shadowRenderCtxt.FarDistance, 0 ); //#warning INSTANSING! foreach ( var instance in instances ) { if (!instance.Visible) { continue; } device.PipelineState = factory[ (int)ApplyFlags( null, instance, SurfaceFlags.SHADOW ) ]; cbData.World = instance.World; constBuffer.SetData( cbData ); if (instance.IsSkinned) { constBufferBones.SetData( instance.BoneTransforms ); device.VertexShaderConstants[3] = constBufferBones ; } device.SetupVertexInput( instance.vb, instance.ib ); device.DrawIndexed( instance.indexCount, 0, 0 ); rs.Counters.ShadowDIPs++; } } }
/// <summary> /// /// </summary> /// <param name="camera"></param> /// <param name="depthBuffer"></param> /// <param name="hdrTarget"></param> /// <param name="diffuse"></param> /// <param name="specular"></param> /// <param name="normals"></param> internal void RenderGBuffer(GameTime gameTime, StereoEye stereoEye, Camera camera, HdrFrame frame, RenderWorld rw, bool staticOnly) { using (new PixEvent("RenderGBuffer")) { if (surfaceShader == null) { return; } if (rs.SkipSceneRendering) { return; } var device = Game.GraphicsDevice; var view = camera.GetViewMatrix(stereoEye); var projection = camera.GetProjectionMatrix(stereoEye); var viewPosition = camera.GetCameraPosition4(stereoEye); var cbData = new CBMeshInstanceData(); var cbDataSubset = new CBSubsetData(); var hdr = frame.HdrBuffer.Surface; var depth = frame.DepthBuffer.Surface; var gbuffer0 = frame.GBuffer0.Surface; var gbuffer1 = frame.GBuffer1.Surface; var feedback = frame.FeedbackBuffer.Surface; device.ResetStates(); device.SetTargets(depth, hdr, gbuffer0, gbuffer1, feedback); device.PixelShaderSamplers[0] = SamplerState.LinearPointClamp; device.PixelShaderSamplers[1] = SamplerState.PointClamp; device.PixelShaderSamplers[2] = SamplerState.AnisotropicClamp; var instances = rw.Instances; if (instances.Any()) { device.PixelShaderResources[1] = rs.VTSystem.PageTable; device.PixelShaderResources[2] = rs.VTSystem.PhysicalPages0; device.PixelShaderResources[3] = rs.VTSystem.PhysicalPages1; device.PixelShaderResources[4] = rs.VTSystem.PhysicalPages2; } //#warning INSTANSING! foreach (var instance in instances) { if (!instance.Visible) { continue; } if (staticOnly && !instance.Static) { continue; } cbData.View = view; cbData.Projection = projection; cbData.World = instance.World; cbData.ViewPos = viewPosition; cbData.Color = instance.Color; cbData.ViewBounds = new Vector4(hdr.Width, hdr.Height, hdr.Width, hdr.Height); cbData.VTPageScaleRCP = rs.VTSystem.PageScaleRCP; constBuffer.SetData(cbData); device.PixelShaderConstants[0] = constBuffer; device.VertexShaderConstants[0] = constBuffer; device.PixelShaderConstants[1] = constBufferSubset; device.SetupVertexInput(instance.vb, instance.ib); if (instance.IsSkinned) { constBufferBones.SetData(instance.BoneTransforms); device.VertexShaderConstants[3] = constBufferBones; } try { device.PipelineState = factory[(int)(SurfaceFlags.GBUFFER | SurfaceFlags.RIGID)]; foreach (var subset in instance.Subsets) { var vt = rw.VirtualTexture; var rect = vt.GetTexturePosition(subset.Name); cbDataSubset.Rectangle = new Vector4(rect.X, rect.Y, rect.Width, rect.Height); constBufferSubset.SetData(cbDataSubset); device.PixelShaderConstants[1] = constBufferSubset; device.DrawIndexed(subset.PrimitiveCount * 3, subset.StartPrimitive * 3, 0); } rs.Counters.SceneDIPs++; } catch (UbershaderException e) { Log.Warning(e.Message); ExceptionDialog.Show(e); } } // // downsample feedback buffer and readback it to virtual texture : // rs.Filter.StretchRect(frame.FeedbackBufferRB.Surface, frame.FeedbackBuffer, SamplerState.PointClamp); var feedbackBuffer = new VTAddress[HdrFrame.FeedbackBufferWidth * HdrFrame.FeedbackBufferHeight]; frame.FeedbackBufferRB.GetFeedback(feedbackBuffer); rs.VTSystem.Update(feedbackBuffer, gameTime); } }
/// <summary> /// /// </summary> /// <param name="camera"></param> /// <param name="depthBuffer"></param> /// <param name="hdrTarget"></param> /// <param name="diffuse"></param> /// <param name="specular"></param> /// <param name="normals"></param> internal void RenderGBuffer ( StereoEye stereoEye, Camera camera, HdrFrame frame, RenderWorld viewLayer ) { using ( new PixEvent("RenderGBuffer") ) { if (surfaceShader==null) { return; } if (rs.SkipSceneRendering) { return; } var device = Game.GraphicsDevice; var view = camera.GetViewMatrix( stereoEye ); var projection = camera.GetProjectionMatrix( stereoEye ); var viewPosition = camera.GetCameraPosition4( stereoEye ); var cbData = new CBMeshInstanceData(); var hdr = frame.HdrBuffer.Surface; var depth = frame.DepthBuffer.Surface; var diffuse = frame.DiffuseBuffer.Surface; var specular = frame.SpecularBuffer.Surface; var normals = frame.NormalMapBuffer.Surface; var scattering = frame.ScatteringBuffer.Surface; device.ResetStates(); device.SetTargets( depth, hdr, diffuse, specular, normals, scattering ); device.PixelShaderSamplers[0] = SamplerState.AnisotropicWrap ; var instances = viewLayer.Instances; //#warning INSTANSING! foreach ( var instance in instances ) { if (!instance.Visible) { continue; } cbData.View = view; cbData.Projection = projection; cbData.World = instance.World; cbData.ViewPos = viewPosition; constBuffer.SetData( cbData ); device.PixelShaderConstants[0] = constBuffer ; device.VertexShaderConstants[0] = constBuffer ; device.SetupVertexInput( instance.vb, instance.ib ); if (instance.IsSkinned) { constBufferBones.SetData( instance.BoneTransforms ); device.VertexShaderConstants[3] = constBufferBones ; } try { foreach ( var sg in instance.ShadingGroups ) { device.PipelineState = instance.IsSkinned ? sg.Material.GBufferSkinned : sg.Material.GBufferRigid; device.PixelShaderConstants[1] = sg.Material.ConstantBufferParameters; device.PixelShaderConstants[2] = sg.Material.ConstantBufferUVModifiers; device.VertexShaderConstants[1] = sg.Material.ConstantBufferParameters; device.VertexShaderConstants[2] = sg.Material.ConstantBufferUVModifiers; sg.Material.SetTextures( device ); device.DrawIndexed( sg.IndicesCount, sg.StartIndex, 0 ); rs.Counters.SceneDIPs++; } } catch ( UbershaderException e ) { Log.Warning( e.Message ); ExceptionDialog.Show( e ); } } } }