/// <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 ); } } } }
/// <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> internal void Render(RenderTargetSurface colorBuffer, DepthStencilSurface depthBuffer, Camera camera) { DrawTracers(); if (!vertexDataAccum.Any()) { return; } if (Game.RenderSystem.SkipDebugRendering) { vertexDataAccum.Clear(); return; } var dev = Game.GraphicsDevice; dev.ResetStates(); dev.SetTargets(depthBuffer, colorBuffer); var a = camera.GetProjectionMatrix(StereoEye.Mono).M11; var b = camera.GetProjectionMatrix(StereoEye.Mono).M22; var w = (float)colorBuffer.Width; var h = (float)colorBuffer.Height; constData.View = camera.GetViewMatrix(StereoEye.Mono); constData.Projection = camera.GetProjectionMatrix(StereoEye.Mono); constData.ViewPosition = camera.GetCameraPosition4(StereoEye.Mono); constData.PixelSize = new Vector4(1 / w / a, 1 / b / h, 1 / w, 1 / h); constBuffer.SetData(constData); dev.SetupVertexInput(vertexBuffer, null); dev.VertexShaderConstants[0] = constBuffer; dev.PixelShaderConstants[0] = constBuffer; dev.GeometryShaderConstants[0] = constBuffer; var flags = new[] { RenderFlags.SOLID, RenderFlags.GHOST }; foreach (var flag in flags) { dev.PipelineState = factory[(int)flag]; int numDPs = MathUtil.IntDivUp(vertexDataAccum.Count, vertexBufferSize); for (int i = 0; i < numDPs; i++) { int numVerts = i < numDPs - 1 ? vertexBufferSize : vertexDataAccum.Count % vertexBufferSize; if (numVerts == 0) { break; } vertexDataAccum.CopyTo(i * vertexBufferSize, vertexArray, 0, numVerts); vertexBuffer.SetData(vertexArray, 0, numVerts); dev.Draw(numVerts, 0); } } vertexDataAccum.Clear(); }