internal static void DrawFullscreenQuad(MyViewport?customViewport = null) { if (customViewport.HasValue) { RC.DeviceContext.Rasterizer.SetViewport(customViewport.Value.OffsetX, customViewport.Value.OffsetY, customViewport.Value.Width, customViewport.Value.Height); } else { RC.DeviceContext.Rasterizer.SetViewport(0, 0, MyRender11.ViewportResolution.X, MyRender11.ViewportResolution.Y); } // set vertex buffer: if (!MyStereoRender.Enable || MyStereoRender.RenderRegion == MyStereoRegion.FULLSCREEN) { RC.SetVB(0, m_VBFullscreen.Buffer, m_VBFullscreen.Stride); } else if (MyStereoRender.RenderRegion == MyStereoRegion.LEFT) { RC.SetVB(0, m_VBLeftPart.Buffer, m_VBLeftPart.Stride); } else if (MyStereoRender.RenderRegion == MyStereoRegion.RIGHT) { RC.SetVB(0, m_VBRightPart.Buffer, m_VBRightPart.Stride); } if (MyStereoRender.Enable) { MyStereoRender.PSBindRawCB_FrameConstants(RC); } RC.DeviceContext.InputAssembler.PrimitiveTopology = SharpDX.Direct3D.PrimitiveTopology.TriangleStrip; RC.SetIL(m_IL); RC.SetVS(m_VSCopy); RC.DeviceContext.Draw(4, 0); MyRender11.ProcessDebugOutput(); RC.DeviceContext.InputAssembler.PrimitiveTopology = SharpDX.Direct3D.PrimitiveTopology.TriangleList; if (MyStereoRender.Enable) { RC.DeviceContext.PixelShader.SetConstantBuffer(MyCommon.FRAME_SLOT, MyCommon.FrameConstants); } }
internal static void DrawFullscreenQuad(MyViewport?customViewport = null) { if (customViewport.HasValue) { RC.SetViewport(customViewport.Value.OffsetX, customViewport.Value.OffsetY, customViewport.Value.Width, customViewport.Value.Height); } else { RC.SetScreenViewport(); } // set vertex buffer: if (!MyStereoRender.Enable || MyStereoRender.RenderRegion == MyStereoRegion.FULLSCREEN) { RC.SetVertexBuffer(0, m_VBFullscreen.Buffer, m_VBFullscreen.Stride); } else if (MyStereoRender.RenderRegion == MyStereoRegion.LEFT) { RC.SetVertexBuffer(0, m_VBLeftPart.Buffer, m_VBLeftPart.Stride); } else if (MyStereoRender.RenderRegion == MyStereoRegion.RIGHT) { RC.SetVertexBuffer(0, m_VBRightPart.Buffer, m_VBRightPart.Stride); } if (MyStereoRender.Enable) { MyStereoRender.PSBindRawCB_FrameConstants(RC); } RC.SetPrimitiveTopology(SharpDX.Direct3D.PrimitiveTopology.TriangleStrip); RC.SetInputLayout(m_IL); RC.VertexShader.Set(m_VSCopy); RC.Draw(4, 0); RC.SetPrimitiveTopology(SharpDX.Direct3D.PrimitiveTopology.TriangleList); if (MyStereoRender.Enable) { RC.PixelShader.SetConstantBuffer(MyCommon.FRAME_SLOT, MyCommon.FrameConstants); } }
internal static void Render(ISrvTexture postProcessedShadows) { MyLights.Update(); MyGpuProfiler.IC_BeginBlock("Map lights to tiles"); if (MyRender11.DebugOverrides.PointLights) { PreparePointLights(); } MyGpuProfiler.IC_BeginNextBlock("Apply point lights"); RC.SetPrimitiveTopology(PrimitiveTopology.TriangleList); if (!MyStereoRender.Enable) { RC.ComputeShader.SetConstantBuffer(MyCommon.FRAME_SLOT, MyCommon.FrameConstants); RC.PixelShader.SetConstantBuffer(MyCommon.FRAME_SLOT, MyCommon.FrameConstants); } else { MyStereoRender.CSBindRawCB_FrameConstants(RC); MyStereoRender.PSBindRawCB_FrameConstants(RC); } RC.PixelShader.SetSrvs(0, MyGBuffer.Main); RC.AllShaderStages.SetRawSrv(MyCommon.MATERIAL_BUFFER_SLOT, MySceneMaterials.m_buffer.Srv); RC.SetBlendState(MyBlendStateManager.BlendAdditive); if (!MyStereoRender.Enable) { RC.SetDepthStencilState(MyDepthStencilStateManager.IgnoreDepthStencil); } else { RC.SetDepthStencilState(MyDepthStencilStateManager.StereoIgnoreDepthStencil); } RC.PixelShader.SetSamplers(0, MySamplerStateManager.StandardSamplers); if (MyRender11.DebugOverrides.PointLights) { RenderPointlightsTiled(); } MyGpuProfiler.IC_BeginNextBlock("Apply spotlights"); if (MyRender11.DebugOverrides.SpotLights) { RenderSpotlights(); } MyGpuProfiler.IC_BeginNextBlock("Apply directional light"); if (MyRender11.DebugOverrides.EnvLight) { RenderDirectionalEnvironmentLight(postProcessedShadows); } MyGpuProfiler.IC_EndBlock(); // Because of BindGBufferForRead: RC.AllShaderStages.SetSrv(0, null); RC.AllShaderStages.SetSrv(1, null); RC.AllShaderStages.SetSrv(2, null); RC.AllShaderStages.SetSrv(3, null); RC.AllShaderStages.SetSrv(4, null); RC.SetBlendState(null); RC.SetRtv(null); }
internal unsafe static void RenderSpotlights() { RC.SetRtv(MyGBuffer.Main.DepthStencil, MyDepthStencilAccess.ReadOnly, MyGBuffer.Main.LBuffer); RC.SetViewport(0, 0, MyRender11.ViewportResolution.X, MyRender11.ViewportResolution.Y); RC.SetPrimitiveTopology(SharpDX.Direct3D.PrimitiveTopology.TriangleList); if (MyStereoRender.Enable) { MyStereoRender.PSBindRawCB_FrameConstants(RC); MyStereoRender.SetViewport(RC); } var coneMesh = MyMeshes.GetMeshId(X.TEXT_("Models/Debug/Cone.mwm"), 1.0f); var buffers = MyMeshes.GetLodMesh(coneMesh, 0).Buffers; RC.SetVertexBuffer(0, buffers.VB0.Buffer, buffers.VB0.Stride); RC.SetIndexBuffer(buffers.IB.Buffer, buffers.IB.Format); RC.VertexShader.Set(SpotlightProxyVs); RC.SetInputLayout(SpotlightProxyIL); RC.PixelShader.Set(SpotlightPs_Pixel); RC.SetRasterizerState(MyRasterizerStateManager.InvTriRasterizerState); var cb = MyCommon.GetObjectCB(sizeof(SpotlightConstants)); RC.AllShaderStages.SetConstantBuffer(1, cb); RC.PixelShader.SetSampler(13, MySamplerStateManager.Alphamask); RC.PixelShader.SetSampler(14, MySamplerStateManager.Shadowmap); RC.PixelShader.SetSampler(15, MySamplerStateManager.Shadowmap); int index = 0; int casterIndex = 0; foreach (var id in VisibleSpotlights) { SpotlightConstants spotlight = new SpotlightConstants(); MyLights.WriteSpotlightConstants(id, ref spotlight); var mapping = MyMapping.MapDiscard(cb); mapping.WriteAndPosition(ref spotlight); mapping.Unmap(); RC.PixelShader.SetSrv(13, MyLights.Spotlights[id.Index].ReflectorTexture); if (id.CastsShadowsThisFrame) { RC.PixelShader.SetSrv(14, MyRender11.DynamicShadows.ShadowmapsPool[casterIndex]); casterIndex++; } if (MyRender11.MultisamplingEnabled) { RC.SetDepthStencilState(MyDepthStencilStateManager.TestEdgeStencil, 0); RC.PixelShader.Set(SpotlightPs_Pixel); } RC.DrawIndexed(MyMeshes.GetLodMesh(coneMesh, 0).Info.IndicesNum, 0, 0); if (MyRender11.MultisamplingEnabled) { RC.PixelShader.Set(SpotlightPs_Sample); RC.SetDepthStencilState(MyDepthStencilStateManager.TestEdgeStencil, 0x80); RC.DrawIndexed(MyMeshes.GetLodMesh(coneMesh, 0).Info.IndicesNum, 0, 0); } index++; if (index >= SPOTLIGHTS_MAX) { break; } } if (MyRender11.MultisamplingEnabled) { RC.SetDepthStencilState(MyDepthStencilStateManager.DefaultDepthState); } RC.SetRasterizerState(null); RC.SetRtv(null); }