internal static void UpdateEnvironmentProbes(MyCullQuery cullQuery) { if (MyRender11.IsIntelBrokenCubemapsWorkaround) { return; } if (m_cubemapDepth == RwTexId.NULL) { m_cubemapDepth = MyRwTextures.CreateShadowmapArray(MyEnvironmentProbe.CubeMapResolution, MyEnvironmentProbe.CubeMapResolution, 6, Format.R24G8_Typeless, Format.D24_UNorm_S8_UInt, Format.R24_UNorm_X8_Typeless); } if (Instance.cubemapPrefiltered == RwTexId.NULL) { Instance.cubemapPrefiltered = MyRwTextures.CreateCubemap(MyEnvironmentProbe.CubeMapResolution, Format.R16G16B16A16_Float, "Environment Prefiltered Probe"); Instance.workCubemap = MyRwTextures.CreateCubemap(MyEnvironmentProbe.CubeMapResolution, Format.R16G16B16A16_Float, "Environment Probe"); Instance.workCubemapPrefiltered = MyRwTextures.CreateCubemap(MyEnvironmentProbe.CubeMapResolution, Format.R16G16B16A16_Float, "Environment Prefiltered Probe"); Instance.prevWorkCubemapPrefiltered = MyRwTextures.CreateCubemap(MyEnvironmentProbe.CubeMapResolution, Format.R16G16B16A16_Float, "Environment Prefiltered Probe"); Instance.ImmediateProbe(cullQuery); } else { Instance.StepUpdateProbe(cullQuery); } }
internal static void UpdateEnvironmentProbes() { if (MyRender11.IsIntelBrokenCubemapsWorkaround) { return; } if (m_cubemapDepth == RwTexId.NULL) { m_cubemapDepth = MyRwTextures.CreateShadowmapArray(256, 256, 6, Format.R24G8_Typeless, Format.D24_UNorm_S8_UInt, Format.R24_UNorm_X8_Typeless); } if (m_envProbe.cubemapPrefiltered == RwTexId.NULL) { m_envProbe.cubemapPrefiltered = MyRwTextures.CreateCubemap(256, Format.R16G16B16A16_Float, "environment prefitlered probe"); m_envProbe.workCubemap = MyRwTextures.CreateCubemap(256, Format.R16G16B16A16_Float, "environment probe"); m_envProbe.workCubemapPrefiltered = MyRwTextures.CreateCubemap(256, Format.R16G16B16A16_Float, "environment prefitlered probe"); m_envProbe.prevWorkCubemapPrefiltered = MyRwTextures.CreateCubemap(256, Format.R16G16B16A16_Float, "environment prefitlered probe"); m_envProbe.ImmediateProbe(); } else { m_envProbe.StepUpdateProbe(); } }
internal static void BuildMipmaps(RwTexId texture) { RC.DeviceContext.ComputeShader.Set(m_mipmap); var mipLevels = texture.Description2d.MipLevels; var side = texture.Description2d.Width; for (int j = 0; j < 6; ++j) { var mipSide = side; for (int i = 1; i < mipLevels; ++i) { ComputeShaderId.TmpUav[0] = texture.SubresourceUav(j, i); RC.DeviceContext.ComputeShader.SetUnorderedAccessViews(0, ComputeShaderId.TmpUav, ComputeShaderId.TmpCount); RC.DeviceContext.ComputeShader.SetShaderResource(0, texture.SubresourceSrv(j, i - 1)); RC.DeviceContext.Dispatch((mipSide + 7) / 8, (mipSide + 7) / 8, 1); RC.DeviceContext.ComputeShader.SetShaderResource(0, null); mipSide >>= 1; } } ComputeShaderId.TmpUav[0] = null; RC.DeviceContext.ComputeShader.SetUnorderedAccessViews(0, ComputeShaderId.TmpUav, ComputeShaderId.TmpCount); RC.DeviceContext.ComputeShader.Set(null); }
internal static void Init() { m_buildHistogram = MyShaders.CreateCs("histogram.hlsl", "build_histogram", MyShaderHelpers.FormatMacros("NUMTHREADS 8")); m_drawHistogram = MyShaders.CreatePs("data_visualization.hlsl", "display_histogram"); m_histogram = MyRwTextures.CreateUav1D(512, SharpDX.DXGI.Format.R32_UInt, "histogram"); }
internal static void CreateScreenResources() { var width = m_resolution.X; var height = m_resolution.Y; var samples = RenderSettings.AntialiasingMode.SamplesCount(); if (MyGBuffer.Main == null) { MyGBuffer.Main = new MyGBuffer(); } MyGBuffer.Main.Resize(width, height, samples, 0); MyScreenDependants.Resize(width, height, samples, 0); RemoveScreenResources(); m_resolvedLight = new MyRenderTarget(width, height, Format.R11G11B10_Float, 1, 0); m_reduce0 = new MyUnorderedAccessTexture(width, height, Format.R32G32_Float); m_reduce0.SetDebugName("reduce0"); m_reduce1 = new MyUnorderedAccessTexture(width, height, Format.R32G32_Float); m_reduce1.SetDebugName("reduce1"); m_uav3 = new MyUnorderedAccessTexture(width, height, Format.R11G11B10_Float); m_localLum = new MyUnorderedAccessTexture( (width + MyLuminanceAverage.NumThreads - 1) / MyLuminanceAverage.NumThreads, (height + MyLuminanceAverage.NumThreads - 1) / MyLuminanceAverage.NumThreads, Format.R32_Float); m_div2 = new MyUnorderedAccessTexture(width / 2, height / 2, Format.R11G11B10_Float); m_div4 = new MyUnorderedAccessTexture(width / 4, height / 4, Format.R11G11B10_Float); m_div8 = new MyUnorderedAccessTexture(width / 8, height / 8, Format.R11G11B10_Float); m_div8_1 = new MyUnorderedAccessTexture(width / 8, height / 8, Format.R11G11B10_Float); m_rgba8_linear = new MyUnorderedAccessTexture(width, height, Format.R8G8B8A8_UNorm); m_rgba8_0 = new MyCustomTexture(width, height, BindFlags.RenderTarget | BindFlags.ShaderResource, Format.R8G8B8A8_Typeless); m_rgba8_0.AddView(new MyViewKey { Fmt = Format.R8G8B8A8_UNorm, View = MyViewEnum.RtvView }); m_rgba8_0.AddView(new MyViewKey { Fmt = Format.R8G8B8A8_UNorm_SRgb, View = MyViewEnum.RtvView }); m_rgba8_0.AddView(new MyViewKey { Fmt = Format.R8G8B8A8_UNorm_SRgb, View = MyViewEnum.SrvView }); m_rgba8_1 = new MyRenderTarget(width, height, Format.R8G8B8A8_UNorm_SRgb, 1, 0); m_rgba8_2 = new MyRenderTarget(width, height, Format.R8G8B8A8_UNorm_SRgb, 1, 0); if (samples > 1) { m_rgba8_ms = new MyRenderTarget(width, height, Format.R8G8B8A8_UNorm_SRgb, samples, 0); } m_prevLum = new MyUnorderedAccessTexture(1, 1, Format.R32G32_Float); Debug.Assert(m_shadowsHelper == RwTexId.NULL); m_shadowsHelper = MyRwTextures.CreateUav2D(width, height, Format.R8_UNorm, "cascade shadows gather"); m_shadowsHelper1 = MyRwTextures.CreateUav2D(width, height, Format.R8_UNorm, "cascade shadows gather 2"); m_gbuffer1Copy = MyRwTextures.CreateScratch2D(width, height, Format.R8G8B8A8_UNorm, samples, 0, "gbuffer 1 copy"); }
internal static void Init() { m_buildHistogram = MyShaders.CreateCs("histogram.hlsl", new[] { new ShaderMacro("NUMTHREADS", 8) }); m_drawHistogram = MyShaders.CreatePs("data_visualization_histogram.hlsl"); m_drawTonemapping = MyShaders.CreatePs("data_visualization_tonemapping.hlsl"); m_histogram = MyRwTextures.CreateUav1D(513, SharpDX.DXGI.Format.R32_UInt, "histogram"); }
public override void Dispose() { if (m_texture != RwTexId.NULL) { MyRwTextures.Destroy(m_texture); m_texture = RwTexId.NULL; } base.Dispose(); }
internal static void CreateScreenResources() { var width = m_resolution.X; var height = m_resolution.Y; var samples = RenderSettings.AntialiasingMode.SamplesCount(); MyUtils.Init(ref MyGBuffer.Main); MyGBuffer.Main.Resize(width, height, samples, 0); MyScreenDependants.Resize(width, height, samples, 0); RemoveScreenResources(); m_reduce0 = new MyUnorderedAccessTexture(width, height, Format.R32G32_Float); m_reduce0.SetDebugName("reduce0"); m_reduce1 = new MyUnorderedAccessTexture(width, height, Format.R32G32_Float); m_reduce1.SetDebugName("reduce1"); m_uav3 = new MyUnorderedAccessTexture(width, height, MyGBuffer.LBufferFormat); m_transparencyAccum = new MyUnorderedAccessTexture(width, height, Format.R16G16B16A16_Float); m_transparencyCoverage = new MyUnorderedAccessTexture(width, height, Format.R8_UNorm); HalfScreenUavHDR = new MyUnorderedAccessTexture(width / 2, height / 2, MyGBuffer.LBufferFormat); QuarterScreenUavHDR = new MyUnorderedAccessTexture(width / 4, height / 4, MyGBuffer.LBufferFormat); EighthScreenUavHDR = new MyUnorderedAccessTexture(width / 8, height / 8, MyGBuffer.LBufferFormat); EighthScreenUavHDRHelper = new MyUnorderedAccessTexture(width / 8, height / 8, MyGBuffer.LBufferFormat); m_rgba8_linear = new MyUnorderedAccessTexture(width, height, Format.R8G8B8A8_UNorm); m_rgba8_0 = new MyCustomTexture(width, height, BindFlags.RenderTarget | BindFlags.ShaderResource, Format.R8G8B8A8_Typeless); m_rgba8_0.AddView(new MyViewKey { Fmt = Format.R8G8B8A8_UNorm, View = MyViewEnum.RtvView }); m_rgba8_0.AddView(new MyViewKey { Fmt = Format.R8G8B8A8_UNorm_SRgb, View = MyViewEnum.RtvView }); m_rgba8_0.AddView(new MyViewKey { Fmt = Format.R8G8B8A8_UNorm_SRgb, View = MyViewEnum.SrvView }); m_rgba8_1 = new MyRenderTarget(width, height, Format.R8G8B8A8_UNorm_SRgb, 1, 0); m_rgba8_2 = new MyRenderTarget(width, height, Format.R8G8B8A8_UNorm_SRgb, 1, 0); if (samples > 1) { m_rgba8_ms = new MyRenderTarget(width, height, Format.R8G8B8A8_UNorm_SRgb, samples, 0); } m_prevLum = new MyUnorderedAccessTexture(1, 1, Format.R32G32_Float); Debug.Assert(PostProcessedShadows == RwTexId.NULL); Debug.Assert(CascadesHelper == RwTexId.NULL); PostProcessedShadows = MyRwTextures.CreateUavRenderTarget(width, height, Format.R8_UNorm); CascadesHelper = MyRwTextures.CreateRenderTarget(width, height, Format.R8_UNorm); m_gbuffer1Copy = MyRwTextures.CreateScratch2D(width, height, Format.R8G8B8A8_UNorm, samples, 0, "gbuffer 1 copy"); }
internal static void ResizeCascades() { if (m_cascadeShadowmapArray != RwTexId.NULL) { MyRwTextures.Destroy(m_cascadeShadowmapArray); } m_cascadeResolution = MyRender11.m_renderSettings.ShadowQuality.Resolution(); m_cascadeShadowmapArray = MyRwTextures.CreateShadowmapArray(m_cascadeResolution, m_cascadeResolution, m_cascadesNum, Format.R24G8_Typeless, Format.D24_UNorm_S8_UInt, Format.R24_UNorm_X8_Typeless, "cascades shadowmaps"); }
public MyVideoPlayer(string filename) // : base(filename) { m_wrapper = XB1Interface.XB1Interface.CreateVideoPlayer(filename); //m_texture = MyRwTextures.CreateDynamicTexture(VideoWidth, VideoHeight, VideoFormat); videoState = VideoState.Stopped; int w = 0, h = 0; m_wrapper.GetVideoFrameSize(ref w, ref h); m_texture = MyRwTextures.CreateDynamicTexture(w, h, VideoFormat); }
internal static void ResizeCascades() { if (m_cascadeShadowmapArray != RwTexId.NULL) { MyRwTextures.Destroy(m_cascadeShadowmapArray); MyRwTextures.Destroy(m_cascadeShadowmapBackup); } var cascadeResolution = MyRender11.m_renderSettings.ShadowQuality.ShadowCascadeResolution(); m_cascadeShadowmapArray = MyRwTextures.CreateShadowmapArray(cascadeResolution, cascadeResolution, m_initializedShadowCascadesCount, Format.R24G8_Typeless, Format.D24_UNorm_S8_UInt, Format.R24_UNorm_X8_Typeless, "Cascades shadowmaps"); m_cascadeShadowmapBackup = MyRwTextures.CreateShadowmapArray(cascadeResolution, cascadeResolution, m_initializedShadowCascadesCount, Format.R24G8_Typeless, Format.D24_UNorm_S8_UInt, Format.R24_UNorm_X8_Typeless, "Cascades shadowmaps backup"); }
internal static void Prefilter(RwTexId probe, RwTexId prefiltered) { RC.DeviceContext.ComputeShader.Set(m_prefilter); var mipLevels = prefiltered.Description2d.MipLevels; var side = prefiltered.Description2d.Width; uint probeSide = (uint)probe.Description2d.Width; ConstantsBufferId constantBuffer = MyCommon.GetObjectCB(32); RC.CSSetCB(1, constantBuffer); RC.DeviceContext.ComputeShader.SetShaderResource(0, probe.ShaderView); RC.DeviceContext.ComputeShader.SetSamplers(0, MyRender11.StandardSamplers); for (int j = 0; j < 6; ++j) { int mipSide = side; for (int i = 0; i < mipLevels; ++i) { uint samplesNum = i == 0 ? 1u : 64u; uint mipSideUint = (uint)mipSide; uint ju = (uint)j; float mipLevelFactor = 1 - (i / (float)(mipLevels - 1)); var mapping = MyMapping.MapDiscard(constantBuffer); mapping.WriteAndPosition(ref samplesNum); mapping.WriteAndPosition(ref probeSide); mapping.WriteAndPosition(ref mipSideUint); mapping.WriteAndPosition(ref ju); mapping.WriteAndPosition(ref mipLevelFactor); mapping.Unmap(); ComputeShaderId.TmpUav[0] = prefiltered.SubresourceUav(j, i); RC.DeviceContext.ComputeShader.SetUnorderedAccessViews(0, ComputeShaderId.TmpUav, ComputeShaderId.TmpCount); RC.DeviceContext.Dispatch((mipSide + 7) / 8, (mipSide + 7) / 8, 1); mipSide >>= 1; } } ComputeShaderId.TmpUav[0] = null; RC.DeviceContext.ComputeShader.SetUnorderedAccessViews(0, ComputeShaderId.TmpUav, ComputeShaderId.TmpCount); RC.DeviceContext.ComputeShader.SetShaderResource(0, null); RC.DeviceContext.ComputeShader.Set(null); }
private void InitCascadeTextures(int cascadeResolution) { DestroyCascadeTextures(); m_cascadeShadowmapArray = MyRwTextures.CreateShadowmapArray(cascadeResolution, cascadeResolution, m_initializedShadowCascadesCount, Format.R24G8_Typeless, Format.D24_UNorm_S8_UInt, Format.R24_UNorm_X8_Typeless, "Cascades shadowmaps"); m_cascadeShadowmapBackup = MyRwTextures.CreateShadowmapArray(cascadeResolution, cascadeResolution, m_initializedShadowCascadesCount, Format.R24G8_Typeless, Format.D24_UNorm_S8_UInt, Format.R24_UNorm_X8_Typeless, "Cascades shadowmaps backup"); if (m_cascadesReferenceCount == 0 && MyScene.SeparateGeometry) { m_combinedShadowmapArray = MyRwTextures.CreateRenderTargetArray(cascadeResolution, cascadeResolution, m_initializedShadowCascadesCount, Format.R32_Float, Format.R32_Float, "Combined shadowmaps"); } ++m_cascadesReferenceCount; }
internal static void Blend(RwTexId dst, RwTexId src0, RwTexId src1, float blendWeight) { //MyImmediateRC.RC.Context.CopyResource(src1.Resource, dst.Resource); RC.DeviceContext.ComputeShader.Set(m_blend); var mipLevels = dst.Description2d.MipLevels; var side = dst.Description2d.Width; RC.CSSetCB(1, MyCommon.GetObjectCB(32)); RC.DeviceContext.ComputeShader.SetSamplers(0, MyRender11.StandardSamplers); for (int j = 0; j < 6; ++j) { var mipSide = side; for (int i = 0; i < mipLevels; ++i) { uint samplesNum = i == 0 ? 1u : 64u; var blendConstantData = new MyBlendData { field0 = 0, field1 = 0, MipSide = (uint)mipSide, field2 = 0, W = blendWeight }; var mapping = MyMapping.MapDiscard(MyCommon.GetObjectCB(32)); mapping.WriteAndPosition(ref blendConstantData); mapping.Unmap(); RC.DeviceContext.ComputeShader.SetShaderResource(0, src0.SubresourceSrv(j, i)); RC.DeviceContext.ComputeShader.SetShaderResource(1, src1.SubresourceSrv(j, i)); // The single parameter version of SetUnorderedAccessView allocates ComputeShaderId.TmpUav[0] = dst.SubresourceUav(j, i); RC.DeviceContext.ComputeShader.SetUnorderedAccessViews(0, ComputeShaderId.TmpUav, ComputeShaderId.TmpCount); RC.DeviceContext.Dispatch((mipSide + 7) / 8, (mipSide + 7) / 8, 1); mipSide >>= 1; } } ComputeShaderId.TmpUav[0] = null; RC.DeviceContext.ComputeShader.SetUnorderedAccessViews(0, ComputeShaderId.TmpUav, ComputeShaderId.TmpCount); RC.DeviceContext.ComputeShader.SetShaderResource(0, null); RC.DeviceContext.ComputeShader.SetShaderResource(1, null); RC.DeviceContext.ComputeShader.Set(null); }
internal static void Combine(RwTexId targetArray, MyShadowCascades firstCascades, MyShadowCascades secondCascades) { if (!MyRender11.Settings.EnableShadows) { return; } ProfilerShort.Begin("MyShadowCascadesPostProcess.Combine"); MyGpuProfiler.IC_BeginBlock("MyShadowCascadesPostProcess.Combine"); firstCascades.FillConstantBuffer(firstCascades.CascadeConstantBuffer); secondCascades.FillConstantBuffer(secondCascades.CascadeConstantBuffer); secondCascades.PostProcessor.MarkCascadesInStencil(secondCascades.CascadeInfo); MyRenderContext renderContext = MyRenderContext.Immediate; DeviceContext deviceContext = renderContext.DeviceContext; deviceContext.PixelShader.SetConstantBuffer(MyCommon.FRAME_SLOT, MyCommon.FrameConstants); deviceContext.PixelShader.SetConstantBuffer(10, firstCascades.CascadeConstantBuffer); deviceContext.PixelShader.SetConstantBuffer(11, secondCascades.CascadeConstantBuffer); deviceContext.PixelShader.SetConstantBuffer(12, m_inverseConstants); for (int subresourceIndex = 0; subresourceIndex < targetArray.Description2d.ArraySize; ++subresourceIndex) { renderContext.BindGBufferForRead(0, MyGBuffer.Main); deviceContext.OutputMerger.SetTargets((DepthStencilView)null, (RenderTargetView)targetArray.SubresourceRtv(subresourceIndex)); deviceContext.PixelShader.SetShaderResource(0, firstCascades.CascadeShadowmapArray.SubresourceSrv(subresourceIndex)); deviceContext.PixelShader.SetShaderResource(1, secondCascades.CascadeShadowmapArray.ShaderView); //deviceContext.PixelShader.SetShaderResource(4, MyGBuffer.Main.DepthStencil.m_SRV_stencil); renderContext.SetPS(m_combinePS); Matrix inverseCascadeMatrix = MatrixD.Transpose(MatrixD.Invert(firstCascades.CascadeInfo[subresourceIndex].CurrentLocalToProjection * MyMatrixHelpers.ClipspaceToTexture)); var mapping = MyMapping.MapDiscard(m_inverseConstants); mapping.WriteAndPosition(ref inverseCascadeMatrix); mapping.Unmap(); MyScreenPass.DrawFullscreenQuad(new MyViewport(0, 0, targetArray.Description2d.Width, targetArray.Description2d.Height)); } deviceContext.OutputMerger.SetTargets(null as DepthStencilView, null as RenderTargetView); deviceContext.PixelShader.SetShaderResource(0, null); deviceContext.PixelShader.SetShaderResource(1, null); deviceContext.PixelShader.SetShaderResource(2, null); MyGpuProfiler.IC_EndBlock(); ProfilerShort.End(); }
private void DestroyCascadeTextures() { MyRender11.Log.WriteLine("DestroyCascadeTextures"); MyRender11.Log.IncreaseIndent(); if (m_cascadeShadowmapArray != RwTexId.NULL) { MyRender11.Log.WriteLine("m_cascadeShadowmapArray destroy"); try { MyRwTextures.Destroy(m_cascadeShadowmapArray); } finally { m_cascadeShadowmapArray = RwTexId.NULL; } } if (m_cascadeShadowmapBackup != RwTexId.NULL) { MyRender11.Log.WriteLine("m_cascadeShadowmapBackup destroy"); try { MyRwTextures.Destroy(m_cascadeShadowmapBackup); } finally { m_cascadeShadowmapBackup = RwTexId.NULL; } } m_cascadesReferenceCount = Math.Max(m_cascadesReferenceCount - 1, 0); if (m_cascadesReferenceCount == 0 && m_combinedShadowmapArray != RwTexId.NULL) { MyRender11.Log.WriteLine("m_combinedShadowmapArray destroy"); try { MyRwTextures.Destroy(m_combinedShadowmapArray); } finally { m_combinedShadowmapArray = RwTexId.NULL; } } MyRender11.Log.DecreaseIndent(); }
private static void DrawCascadeArray(RwTexId textureArray, int quadStartX, int quadStartY, int quadSize) { RC.DeviceContext.PixelShader.Set(m_blitTextureArrayShader); RC.DeviceContext.PixelShader.SetShaderResource(0, textureArray.ShaderView); var cb = MyCommon.GetMaterialCB(sizeof(uint)); RC.DeviceContext.PixelShader.SetConstantBuffer(5, cb); for (uint cascadeIndex = 0; cascadeIndex < MyRender11.Settings.ShadowCascadeCount; cascadeIndex++) { float index = (float)cascadeIndex; var mapping = MyMapping.MapDiscard(cb); mapping.WriteAndPosition(ref index); mapping.Unmap(); DrawQuad(quadStartX + (quadSize + quadStartX / 2) * cascadeIndex, quadStartY, quadSize, quadSize * MyRender11.ViewportResolution.Y / MyRender11.ViewportResolution.X); } RC.DeviceContext.PixelShader.SetShaderResource(0, null); }
private void InitCascadeTextures(int cascadeResolution) { DestroyCascadeTextures(); MyRender11.Log.WriteLine("InitCascadeTextures: " + m_cascadesReferenceCount + " / " + MyScene.SeparateGeometry); m_cascadeShadowmapArray = MyRwTextures.CreateShadowmapArray(cascadeResolution, cascadeResolution, m_initializedShadowCascadesCount, Format.R32_Typeless, Format.D32_Float, Format.R32_Float, "Cascades shadowmaps"); m_cascadeShadowmapBackup = MyRwTextures.CreateShadowmapArray(cascadeResolution, cascadeResolution, m_initializedShadowCascadesCount, Format.R32_Typeless, Format.D32_Float, Format.R32_Float, "Cascades shadowmaps backup"); if (m_cascadesReferenceCount == 0 && MyScene.SeparateGeometry) { MyRender11.Log.WriteLine("InitCascadeTextures m_combinedShadowmapArray"); m_combinedShadowmapArray = MyRwTextures.CreateRenderTargetArray(cascadeResolution, cascadeResolution, m_initializedShadowCascadesCount, Format.R32_Float, Format.R32_Float, "Combined shadowmaps"); } ++m_cascadesReferenceCount; }
internal static void Blend(RwTexId dst, RwTexId src0, RwTexId src1, float w) { //MyImmediateRC.RC.Context.CopyResource(src1.Resource, dst.Resource); RC.Context.ComputeShader.Set(m_blend); var mipLevels = dst.Description2d.MipLevels; var side = dst.Description2d.Width; RC.CSSetCB(1, MyCommon.GetObjectCB(32)); RC.Context.ComputeShader.SetSamplers(0, MyRender11.StandardSamplers); for (int j = 0; j < 6; ++j) { var mipSide = side; for (int i = 0; i < mipLevels; ++i) { uint samplesNum = i == 0 ? 1u : 64u; var mapping = MyMapping.MapDiscard(MyCommon.GetObjectCB(32)); mapping.stream.Write((uint)0); mapping.stream.Write((uint)0); mapping.stream.Write((uint)mipSide); mapping.stream.Write((uint)0); mapping.stream.Write(w); mapping.Unmap(); RC.Context.ComputeShader.SetShaderResources(0, src0.SubresourceSrv(j, i), src1.SubresourceSrv(j, i)); RC.Context.ComputeShader.SetUnorderedAccessView(0, dst.SubresourceUav(j, i)); RC.Context.Dispatch((mipSide + 7) / 8, (mipSide + 7) / 8, 1); mipSide >>= 1; } } RC.Context.ComputeShader.SetUnorderedAccessView(0, null); RC.Context.ComputeShader.SetShaderResources(0, null, null); RC.Context.ComputeShader.Set(null); }
internal static void Prefilter(RwTexId probe, RwTexId prefiltered) { RC.Context.ComputeShader.Set(m_prefilter); var mipLevels = prefiltered.Description2d.MipLevels; var side = prefiltered.Description2d.Width; var probeSide = probe.Description2d.Width; RC.CSSetCB(1, MyCommon.GetObjectCB(32)); RC.Context.ComputeShader.SetShaderResource(0, probe.ShaderView); RC.Context.ComputeShader.SetSamplers(0, MyRender11.StandardSamplers); for (int j = 0; j < 6; ++j) { var mipSide = side; for (int i = 0; i < mipLevels; ++i) { uint samplesNum = i == 0 ? 1u : 64u; var mapping = MyMapping.MapDiscard(MyCommon.GetObjectCB(32)); mapping.stream.Write((uint)samplesNum); mapping.stream.Write((uint)probeSide); mapping.stream.Write((uint)mipSide); mapping.stream.Write((uint)j); mapping.stream.Write(1 - (i / (float)(mipLevels - 1))); mapping.Unmap(); RC.Context.ComputeShader.SetUnorderedAccessView(0, prefiltered.SubresourceUav(j, i)); RC.Context.Dispatch((mipSide + 7) / 8, (mipSide + 7) / 8, 1); mipSide >>= 1; } } RC.Context.ComputeShader.SetUnorderedAccessView(0, null); RC.Context.ComputeShader.SetShaderResource(0, null); RC.Context.ComputeShader.Set(null); }
private void DestroyCascadeTextures() { if (m_cascadeShadowmapArray != RwTexId.NULL) { MyRwTextures.Destroy(m_cascadeShadowmapArray); m_cascadeShadowmapArray = RwTexId.NULL; } if (m_cascadeShadowmapBackup != RwTexId.NULL) { MyRwTextures.Destroy(m_cascadeShadowmapBackup); m_cascadeShadowmapBackup = RwTexId.NULL; } m_cascadesReferenceCount = Math.Max(m_cascadesReferenceCount - 1, 0); if (m_cascadesReferenceCount == 0 && m_combinedShadowmapArray != RwTexId.NULL) { MyRwTextures.Destroy(m_combinedShadowmapArray); m_combinedShadowmapArray = RwTexId.NULL; } }
internal void GatherArray(RwTexId postprocessTarget, RwTexId cascadeArray, MyProjectionInfo[] cascadeInfo, ConstantsBufferId cascadeConstantBuffer) { if (!MyRenderProxy.Settings.EnableShadows) { return; } MarkCascadesInStencil(cascadeInfo); MyGpuProfiler.IC_BeginBlock("Cascades postprocess"); MyRenderContext renderContext = MyRenderContext.Immediate; DeviceContext deviceContext = renderContext.DeviceContext; renderContext.SetCS(m_gatherCS); ComputeShaderId.TmpUav[0] = postprocessTarget.Uav; deviceContext.ComputeShader.SetUnorderedAccessViews(0, ComputeShaderId.TmpUav, ComputeShaderId.TmpCount); deviceContext.ComputeShader.SetShaderResource(0, MyRender11.MultisamplingEnabled ? MyScreenDependants.m_resolvedDepth.m_SRV_depth : MyGBuffer.Main.DepthStencil.m_SRV_depth); deviceContext.ComputeShader.SetShaderResource(1, MyGBuffer.Main.DepthStencil.m_SRV_stencil); deviceContext.ComputeShader.SetSampler(MyCommon.SHADOW_SAMPLER_SLOT, MyRender11.m_shadowmapSamplerState); deviceContext.ComputeShader.SetConstantBuffer(0, MyCommon.FrameConstants); deviceContext.ComputeShader.SetConstantBuffer(4, cascadeConstantBuffer); deviceContext.ComputeShader.SetShaderResource(MyCommon.CASCADES_SM_SLOT, cascadeArray.ShaderView); deviceContext.Dispatch(m_threadGroupCountX, m_threadGroupCountY, 1); ComputeShaderId.TmpUav[0] = null; renderContext.DeviceContext.ComputeShader.SetUnorderedAccessViews(0, ComputeShaderId.TmpUav, ComputeShaderId.TmpCount); deviceContext.ComputeShader.SetShaderResource(0, null); if (MyRender11.Settings.EnableShadowBlur) { MyBlur.Run(postprocessTarget.Rtv, MyRender11.CascadesHelper.Rtv, MyRender11.CascadesHelper.ShaderView, postprocessTarget.ShaderView, depthDiscardThreshold: 0.2f); } MyGpuProfiler.IC_EndBlock(); }
public MyVideoPlayer(string filename) // : base(filename) { m_wrapper = XB1Interface.XB1Interface.CreateVideoPlayer(filename); //m_texture = MyRwTextures.CreateDynamicTexture(VideoWidth, VideoHeight, VideoFormat); videoState = VideoState.Stopped; int w = 0, h = 0; m_wrapper.GetVideoFrameSize(ref w,ref h); m_texture = MyRwTextures.CreateDynamicTexture(w, h, VideoFormat); }
public MyVideoPlayer(string filename) : base(filename) { m_texture = MyRwTextures.CreateDynamicTexture(VideoWidth, VideoHeight, VideoFormat); }
private static void ProcessMessageInternal(IMyRenderMessage message) { switch (message.MessageType) { case MyRenderMessageEnum.SetCameraViewMatrix: { var rMessage = (MyRenderMessageSetCameraViewMatrix)message; SetupCameraMatrices(rMessage); break; } case MyRenderMessageEnum.DrawScene: { var rMessage = (IMyRenderMessage)message; m_drawQueue.Enqueue(rMessage); m_messageTracker.Clear(); break; } case MyRenderMessageEnum.RebuildCullingStructure: { break; } #region Profiler case MyRenderMessageEnum.RenderProfiler: { var profMessage = (MyRenderMessageRenderProfiler)message; MyRenderProfiler.HandleInput(profMessage.Command, profMessage.Index); break; } #endregion #region Characters case MyRenderMessageEnum.CreateRenderCharacter: { var rMessage = (MyRenderMessageCreateRenderCharacter)message; var actor = MyActorFactory.CreateCharacter(); Matrix worldMatrixF = rMessage.WorldMatrix; //actor.GetRenderable().SetModel(MyAssetsLoader.GetModel(rMessage.Model)); actor.GetRenderable().SetModel(MyMeshes.GetMeshId(X.TEXT(rMessage.Model))); actor.SetMatrix(ref worldMatrixF); if (rMessage.ColorMaskHSV.HasValue) { var color = ColorFromMask(rMessage.ColorMaskHSV.Value); actor.GetRenderable().SetKeyColor(new Vector4(color, 1)); } actor.SetID(rMessage.ID); //var entity = MyComponents.CreateEntity(rMessage.ID); //MyComponents.CreateRenderable( // entity, // MyMeshes.GetMeshId(X.TEXT(rMessage.Model)), // rMessage.ColorMaskHSV.HasValue ? rMessage.ColorMaskHSV.Value : Vector3.One); //MyComponents.SetMatrix(entity, ref rMessage.WorldMatrix); break; } case MyRenderMessageEnum.SetCharacterSkeleton: { var rMessage = (MyRenderMessageSetCharacterSkeleton)message; var actor = MyIDTracker <MyActor> .FindByID(rMessage.CharacterID); if (actor != null) { actor.GetSkinning().SetSkeleton(rMessage.SkeletonBones, rMessage.SkeletonIndices); } //var entity = MyComponents.GetEntity(rMessage.CharacterID); //MyComponents.SetSkeleton(entity, rMessage.SkeletonBones, rMessage.SkeletonIndices); break; }; case MyRenderMessageEnum.SetCharacterTransforms: { var rMessage = (MyRenderMessageSetCharacterTransforms)message; var actor = MyIDTracker <MyActor> .FindByID(rMessage.CharacterID); if (actor != null) { actor.GetSkinning().SetAnimationBones(rMessage.RelativeBoneTransforms); } //var entity = MyComponents.GetEntity(rMessage.CharacterID); //MyComponents.SetAnimation(entity, rMessage.RelativeBoneTransforms); break; } case MyRenderMessageEnum.UpdateRenderEntity: { var rMessage = (MyRenderMessageUpdateRenderEntity)message; var actor = MyIDTracker <MyActor> .FindByID(rMessage.ID); if (actor != null && actor.GetRenderable() != null) { if (rMessage.ColorMaskHSV.HasValue) { actor.GetRenderable().SetKeyColor(new Vector4(ColorFromMask(rMessage.ColorMaskHSV.Value), 1)); } actor.GetRenderable().SetDithering(rMessage.Dithering); if (rMessage.Dithering < 0) { } } break; } case MyRenderMessageEnum.ChangeModelMaterial: { var rMessage = (MyRenderMessageChangeModelMaterial)message; //var matId = MyMeshMaterialId.NULL; //if (rMessage.Material.ToLower().Contains("debug")) //{ // matId = MyMeshMaterials1.DebugMaterialId; //} //else //{ // matId = MyMeshMaterials1.GetMaterialId(rMessage.Material); //} //MyAssetsLoader.GetModel(rMessage.Model).SetMaterial_SLOW(MyMeshMaterials1.GetProxyId(matId)); break; } #endregion #region Render objects case MyRenderMessageEnum.CreateRenderEntity: { var rMessage = (MyRenderMessageCreateRenderEntity)message; Matrix m = (Matrix)rMessage.WorldMatrix; var actor = MyActorFactory.CreateSceneObject(); if (rMessage.Model != null) { var model = MyAssetsLoader.ModelRemap.Get(rMessage.Model, rMessage.Model); actor.GetRenderable().SetModel(MyMeshes.GetMeshId(X.TEXT(model))); //if (MyDestructionMesh.ModelsDictionary.ContainsKey(model)) //{ // //actor.GetRenderable().SetModel(MyDestructionMesh.ModelsDictionary.Get(model)); // actor.GetRenderable().SetModel(MyMeshes.GetMeshId(X.TEXT(model))); //} //else //{ // //actor.GetRenderable().SetModel(MyAssetsLoader.GetModel(model)); // actor.GetRenderable().SetModel(MyMeshes.GetMeshId(X.TEXT(model))); //} } actor.SetID(rMessage.ID); actor.SetMatrix(ref m); break; } case MyRenderMessageEnum.CreateRenderVoxelDebris: { var rMessage = (MyRenderMessageCreateRenderVoxelDebris)message; Matrix m = (Matrix)rMessage.WorldMatrix; var actor = MyActorFactory.CreateSceneObject(); if (rMessage.Model != null) { actor.GetRenderable().SetModel(MyMeshes.GetMeshId(X.TEXT(rMessage.Model))); } actor.SetID(rMessage.ID); actor.SetMatrix(ref m); MyRenderableComponent.DebrisEntityVoxelMaterial[rMessage.ID] = rMessage.VoxelMaterialIndex; break; } case MyRenderMessageEnum.UpdateRenderObject: { var rMessage = (MyRenderMessageUpdateRenderObject)message; var actor = MyIDTracker <MyActor> .FindByID(rMessage.ID); if (actor != null) { Matrix m = (Matrix)rMessage.WorldMatrix; actor.SetMatrix(ref m); if (rMessage.AABB.HasValue) { actor.SetAabb((BoundingBox)rMessage.AABB.Value); } } var entity = MyComponents.GetEntity(rMessage.ID); if (entity != EntityId.NULL) { MyComponents.SetMatrix(entity, ref rMessage.WorldMatrix); if (rMessage.AABB.HasValue) { var aabb = rMessage.AABB.Value; MyComponents.SetAabb(entity, ref aabb); } } break; } case MyRenderMessageEnum.RemoveRenderObject: { var rMessage = (MyRenderMessageRemoveRenderObject)message; var actor = MyIDTracker <MyActor> .FindByID(rMessage.ID); if (actor != null) { if (actor.GetRenderable() != null && actor.GetRenderable().GetModel().Info.Dynamic) { MyMeshes.RemoveMesh(actor.GetRenderable().GetModel()); } actor.Destruct(); } var instancing = MyInstancing.Get(rMessage.ID); if (instancing != InstancingId.NULL) { MyInstancing.Remove(rMessage.ID, instancing); } var light = MyLights.Get(rMessage.ID); if (light != LightId.NULL) { MyLights.Remove(rMessage.ID, light); } var clipmap = MyClipmapFactory.ClipmapByID.Get(rMessage.ID); if (clipmap != null) { clipmap.RemoveFromUpdate(); } break; } case MyRenderMessageEnum.UpdateRenderObjectVisibility: { var rMessage = (MyRenderMessageUpdateRenderObjectVisibility)message; var actor = MyIDTracker <MyActor> .FindByID(rMessage.ID); if (actor != null) { actor.SetVisibility(rMessage.Visible); } break; } case MyRenderMessageEnum.CreateRenderInstanceBuffer: { var rMessage = (MyRenderMessageCreateRenderInstanceBuffer)message; //var instancing = MyComponentFactory<MyInstancingComponent>.Create(); //instancing.SetID(rMessage.ID); //instancing.Init(rMessage.Type); //instancing.SetDebugName(rMessage.DebugName); MyInstancing.Create(rMessage.ID, rMessage.Type, rMessage.DebugName); break; } case MyRenderMessageEnum.UpdateRenderInstanceBuffer: { var rMessage = (MyRenderMessageUpdateRenderInstanceBuffer)message; //var instancing = MyIDTracker<MyInstancingComponent>.FindByID(rMessage.ID); //if(instancing != null) //{ // instancing.UpdateGeneric(rMessage.InstanceData, rMessage.Capacity); //} MyInstancing.UpdateGeneric(MyInstancing.Get(rMessage.ID), rMessage.InstanceData, rMessage.Capacity); rMessage.InstanceData.Clear(); break; } case MyRenderMessageEnum.UpdateRenderCubeInstanceBuffer: { var rMessage = (MyRenderMessageUpdateRenderCubeInstanceBuffer)message; //var instancing = MyIDTracker<MyInstancingComponent>.FindByID(rMessage.ID); //if (instancing != null) //{ // instancing.UpdateCube(rMessage.InstanceData, rMessage.Capacity); //} MyInstancing.UpdateCube(MyInstancing.Get(rMessage.ID), rMessage.InstanceData, rMessage.Capacity); rMessage.InstanceData.Clear(); break; } case MyRenderMessageEnum.SetInstanceBuffer: { var rMessage = (MyRenderMessageSetInstanceBuffer)message; var actor = MyIDTracker <MyActor> .FindByID(rMessage.ID); //var instancing = MyIDTracker<MyInstancingComponent>.FindByID(rMessage.InstanceBufferId); if (actor != null) { //if (actor.GetComponent(MyActorComponentEnum.Instancing) != instancing) //{ // actor.AddComponent(instancing); //} //actor.SetLocalAabb(rMessage.LocalAabb); //actor.GetRenderable().SetInstancingCounters(rMessage.InstanceCount, rMessage.InstanceStart); actor.GetRenderable().SetInstancing(MyInstancing.Get(rMessage.InstanceBufferId)); actor.SetLocalAabb(rMessage.LocalAabb); actor.GetRenderable().SetInstancingCounters(rMessage.InstanceCount, rMessage.InstanceStart); } break; } case MyRenderMessageEnum.CreateManualCullObject: { var rMessage = (MyRenderMessageCreateManualCullObject)message; var actor = MyActorFactory.CreateGroup(); actor.SetID(rMessage.ID); Matrix m = (Matrix)rMessage.WorldMatrix; actor.SetMatrix(ref m); break; } case MyRenderMessageEnum.SetParentCullObject: { var rMessage = (MyRenderMessageSetParentCullObject)message; var child = MyIDTracker <MyActor> .FindByID(rMessage.ID); var parent = MyIDTracker <MyActor> .FindByID(rMessage.CullObjectID); if (child != null && parent != null && parent.GetGroupRoot() != null && child.GetGroupLeaf() == null) { child.SetRelativeTransform(rMessage.ChildToParent); parent.GetGroupRoot().Add(child); } break; } case MyRenderMessageEnum.CreateLineBasedObject: { var rMessage = (MyRenderMessageCreateLineBasedObject)message; var actor = MyActorFactory.CreateSceneObject(); //actor.GetRenderable().SetModel(new MyDynamicMesh()); actor.SetID(rMessage.ID); actor.SetMatrix(ref Matrix.Identity); MyMeshMaterials1.GetMaterialId("__ROPE_MATERIAL", null, "Textures/rope_cm.dds", "Textures/rope_ng.dds", "Textures/rope_add.dds", MyMesh.DEFAULT_MESH_TECHNIQUE); actor.GetRenderable().SetModel(MyMeshes.CreateRuntimeMesh(X.TEXT("LINE" + rMessage.ID), 1, true)); break; } case MyRenderMessageEnum.UpdateLineBasedObject: { var rMessage = (MyRenderMessageUpdateLineBasedObject)message; var actor = MyIDTracker <MyActor> .FindByID(rMessage.ID); if (actor != null) { //var mesh = actor.GetRenderable().GetMesh() as MyDynamicMesh; MyVertexFormatPositionH4 [] stream0; MyVertexFormatTexcoordNormalTangent [] stream1; MyLineHelpers.GenerateVertexData(ref rMessage.WorldPointA, ref rMessage.WorldPointB, out stream0, out stream1); var indices = MyLineHelpers.GenerateIndices(stream0.Length); var sections = new MySectionInfo[] { new MySectionInfo { TriCount = indices.Length / 3, IndexStart = 0, MaterialName = "__ROPE_MATERIAL" } }; MyMeshes.UpdateRuntimeMesh(MyMeshes.GetMeshId(X.TEXT("LINE" + rMessage.ID)), indices, stream0, stream1, sections, (BoundingBox)MyLineHelpers.GetBoundingBox(ref rMessage.WorldPointA, ref rMessage.WorldPointB)); //actor.SetAabb((BoundingBox)MyLineHelpers.GetBoundingBox(ref rMessage.WorldPointA, ref rMessage.WorldPointB)); actor.MarkRenderDirty(); var matrix = Matrix.CreateTranslation((Vector3)(rMessage.WorldPointA + rMessage.WorldPointB) * 0.5f); actor.SetMatrix(ref matrix); } break; } case MyRenderMessageEnum.SetRenderEntityData: { var rMessage = (MyRenderMessageSetRenderEntityData)message; Debug.Assert(false, "MyRenderMessageSetRenderEntityData is deprecated!"); break; } case MyRenderMessageEnum.AddRuntimeModel: { var rMessage = (MyRenderMessageAddRuntimeModel)message; //MyDestructionMesh mesh = MyDestructionMesh.ModelsDictionary.Get(rMessage.Name); //if (mesh == null) //{ //mesh = new MyDestructionMesh(rMessage.Name); //ProfilerShort.Begin("LoadBuffers"); //mesh.Fill(rMessage.ModelData.Indices, rMessage.ModelData.Positions, rMessage.ModelData.Normals, rMessage.ModelData.Tangents, rMessage.ModelData.TexCoords, rMessage.ModelData.Sections, rMessage.ModelData.AABB); //ProfilerShort.End(); if (!MyMeshes.Exists(rMessage.Name)) { { ushort[] indices = new ushort[rMessage.ModelData.Indices.Count]; for (int i = 0; i < rMessage.ModelData.Indices.Count; i++) { indices[i] = (ushort)rMessage.ModelData.Indices[i]; } var verticesNum = rMessage.ModelData.Positions.Count; MyVertexFormatPositionH4[] stream0 = new MyVertexFormatPositionH4[verticesNum]; MyVertexFormatTexcoordNormalTangent[] stream1 = new MyVertexFormatTexcoordNormalTangent[verticesNum]; for (int i = 0; i < verticesNum; i++) { stream0[i] = new MyVertexFormatPositionH4(rMessage.ModelData.Positions[i]); stream1[i] = new MyVertexFormatTexcoordNormalTangent( rMessage.ModelData.TexCoords[i], rMessage.ModelData.Normals[i], rMessage.ModelData.Tangents[i]); } var id = MyMeshes.CreateRuntimeMesh(X.TEXT(rMessage.Name), rMessage.ModelData.Sections.Count, false); MyMeshes.UpdateRuntimeMesh(id, indices, stream0, stream1, rMessage.ModelData.Sections.ToArray(), rMessage.ModelData.AABB); } if (rMessage.ReplacedModel != null) { //MyAssetsLoader.ModelRemap[rMessage.ReplacedModel] = rMessage.Name; MyAssetsLoader.ModelRemap[rMessage.Name] = rMessage.ReplacedModel; } //if (MyAssetsLoader.LOG_MESH_STATISTICS) //{ // mesh.DebugWriteInfo(); //} } break; } case MyRenderMessageEnum.UpdateModelProperties: { var rMessage = (MyRenderMessageUpdateModelProperties)message; var actor = MyIDTracker <MyActor> .FindByID(rMessage.ID); if (actor != null) { var key = new MyEntityMaterialKey { LOD = rMessage.LOD, Material = X.TEXT(rMessage.MaterialName) }; if (rMessage.Enabled.HasValue) { if (!MyScene.EntityDisabledMaterials.ContainsKey(rMessage.ID)) { MyScene.EntityDisabledMaterials.Add(rMessage.ID, new HashSet <MyEntityMaterialKey>()); } if (!rMessage.Enabled.Value) { MyScene.EntityDisabledMaterials[rMessage.ID].Add(key); } else { MyScene.EntityDisabledMaterials[rMessage.ID].Remove(key); } } var r = actor.GetRenderable(); if ((rMessage.Emissivity.HasValue || rMessage.DiffuseColor.HasValue) && !r.ModelProperties.ContainsKey(key)) { r.ModelProperties[key] = new MyModelProperties(); } if (rMessage.Emissivity.HasValue) { r.ModelProperties[key].Emissivity = rMessage.Emissivity.Value; } if (rMessage.DiffuseColor.HasValue) { r.ModelProperties[key].ColorMul = rMessage.DiffuseColor.Value; } actor.MarkRenderDirty(); } break; } case MyRenderMessageEnum.PreloadModel: { var rMessage = (MyRenderMessagePreloadModel)message; //MyAssetsLoader.GetModel(rMessage.Name); MyMeshes.GetMeshId(X.TEXT(rMessage.Name)); break; } case MyRenderMessageEnum.ChangeMaterialTexture: { var rMessage = (MyRenderMessageChangeMaterialTexture)message; var actor = MyIDTracker <MyActor> .FindByID(rMessage.RenderObjectID); if (actor != null) { var r = actor.GetRenderable(); var key = new MyEntityMaterialKey { LOD = 0, Material = X.TEXT(rMessage.MaterialName) }; if (!r.ModelProperties.ContainsKey(key)) { r.ModelProperties[key] = new MyModelProperties(); } r.ModelProperties[key].TextureSwap = new MyMaterialTextureSwap { TextureName = X.TEXT(rMessage.TextureName) }; r.FreeCustomRenderTextures(key); actor.MarkRenderDirty(); } break; } case MyRenderMessageEnum.DrawTextToMaterial: { var rMessage = (MyRenderMessageDrawTextToMaterial)message; //rMessage.EntityId //rMessage.FontColor //rMessage.MaterialName //rMessage.Text; //rMessage.TextScale; var actor = MyIDTracker <MyActor> .FindByID(rMessage.RenderObjectID); if (actor != null) { var r = actor.GetRenderable(); var key = new MyEntityMaterialKey { LOD = 0, Material = X.TEXT(rMessage.MaterialName) }; if (!r.ModelProperties.ContainsKey(key)) { r.ModelProperties[key] = new MyModelProperties(); } else { r.ModelProperties[key].TextureSwap = null; } RwTexId handle = r.ModelProperties[key].CustomRenderedTexture; if (handle == RwTexId.NULL && MyModelProperties.CustomTextures < MyModelProperties.MaxCustomTextures) { handle = MyRwTextures.CreateRenderTarget(rMessage.TextureResolution * rMessage.TextureAspectRatio, rMessage.TextureResolution, SharpDX.DXGI.Format.R8G8B8A8_UNorm_SRgb, true); r.ModelProperties[key].CustomRenderedTexture = handle; ++MyModelProperties.CustomTextures; } if (handle != RwTexId.NULL) { var clearColor = new SharpDX.Color4(rMessage.BackgroundColor.PackedValue); clearColor.Alpha = 0; MyRender11.ImmediateContext.ClearRenderTargetView(handle.Rtv, clearColor); // my sprites renderer -> push state MySpritesRenderer.PushState(new Vector2(rMessage.TextureResolution * rMessage.TextureAspectRatio, rMessage.TextureResolution)); MySpritesRenderer.DrawText(Vector2.Zero, new StringBuilder(rMessage.Text), rMessage.FontColor, rMessage.TextScale); // render text with fonts to rt // update texture of proxy MySpritesRenderer.Draw(handle.Rtv, new MyViewport(rMessage.TextureResolution * rMessage.TextureAspectRatio, rMessage.TextureResolution)); // render to rt // my sprites renderer -> pop state MySpritesRenderer.PopState(); MyRender11.ImmediateContext.GenerateMips(handle.ShaderView); actor.MarkRenderDirty(); } else { MyRenderProxy.TextNotDrawnToTexture(rMessage.EntityId); } } else { MyRenderProxy.TextNotDrawnToTexture(rMessage.EntityId); } break; } case MyRenderMessageEnum.PreloadMaterials: { var rMessage = (MyRenderMessagePreloadMaterials)message; //MyAssetsLoader.GetMaterials(rMessage.Name); MyMeshes.GetMeshId(X.TEXT(rMessage.Name)); break; } #endregion #region Voxels case MyRenderMessageEnum.CreateClipmap: { var rMessage = (MyRenderMessageCreateClipmap)message; var clipmap = new MyClipmapHandler(rMessage.ClipmapId, rMessage.ScaleGroup, rMessage.WorldMatrix, rMessage.SizeLod0); MyClipmapFactory.ClipmapByID[rMessage.ClipmapId] = clipmap; clipmap.Base.LoadContent(); break; } case MyRenderMessageEnum.UpdateClipmapCell: { var rMessage = (MyRenderMessageUpdateClipmapCell)message; var clipmap = MyClipmapFactory.ClipmapByID.Get(rMessage.ClipmapId); if (clipmap != null) { clipmap.Base.UpdateCell(rMessage); } rMessage.Batches.Clear(); break; } case MyRenderMessageEnum.InvalidateClipmapRange: { var rMessage = (MyRenderMessageInvalidateClipmapRange)message; var clipmap = MyClipmapFactory.ClipmapByID.Get(rMessage.ClipmapId); if (clipmap != null) { clipmap.Base.InvalidateRange(rMessage.MinCellLod0, rMessage.MaxCellLod0); } break; } case MyRenderMessageEnum.CreateRenderVoxelMaterials: { var rMessage = (MyRenderMessageCreateRenderVoxelMaterials)message; Debug.Assert(MyVoxelMaterials1.CheckIndices(rMessage.Materials)); MyVoxelMaterials1.Set(rMessage.Materials); rMessage.Materials = null; break; } #endregion #region Lights case MyRenderMessageEnum.CreateRenderLight: { var rMessage = (MyRenderMessageCreateRenderLight)message; //MyLight.Create(rMessage.ID); MyLights.Create(rMessage.ID); break; } case MyRenderMessageEnum.UpdateRenderLight: { var rMessage = (MyRenderMessageUpdateRenderLight)message; var light = MyLights.Get(rMessage.ID); if (light != LightId.NULL) { var lightInfo = new MyLightInfo { Position = rMessage.Position, PositionWithOffset = rMessage.Position + rMessage.Offset * rMessage.Range * rMessage.ReflectorDirection, CastsShadows = rMessage.CastShadows, ShadowsDistance = rMessage.ShadowDistance, ParentGID = rMessage.ParentID, UsedInForward = rMessage.UseInForwardRender }; MyLights.UpdateEntity(light, ref lightInfo); if ((rMessage.Type & LightTypeEnum.PointLight) > 0) { MyLights.UpdatePointlight(light, rMessage.LightOn, rMessage.Range, new Vector3(rMessage.Color.R, rMessage.Color.G, rMessage.Color.B) / 255.0f * rMessage.Intensity, rMessage.Falloff); } if ((rMessage.Type & LightTypeEnum.Hemisphere) > 0) { //rMessage.Color; //rMessage.Falloff; //rMessage.Intensity; //rMessage.LightOn; //rMessage.ReflectorDirection; //rMessage.ReflectorUp; } if ((rMessage.Type & LightTypeEnum.Spotlight) > 0) { // because it's so in dx9... float coneMaxAngleCos = 1 - rMessage.ReflectorConeMaxAngleCos; coneMaxAngleCos = (float)Math.Min(Math.Max(coneMaxAngleCos, 0.01), 0.99f); MyLights.UpdateSpotlight(light, rMessage.ReflectorOn, rMessage.ReflectorDirection, rMessage.ReflectorRange, coneMaxAngleCos, rMessage.ReflectorUp, new Vector3(rMessage.ReflectorColor.R, rMessage.ReflectorColor.G, rMessage.ReflectorColor.B) / 255.0f * rMessage.Intensity, rMessage.ReflectorFalloff, MyTextures.GetTexture(rMessage.ReflectorTexture, MyTextureEnum.CUSTOM)); } if (rMessage.GlareOn) { MyLights.UpdateGlare(light, new MyGlareDesc { Enabled = rMessage.GlareOn, Material = X.TEXT(rMessage.GlareMaterial), Intensity = rMessage.GlareIntensity, QuerySize = rMessage.GlareQuerySize, Type = rMessage.GlareType, Size = rMessage.GlareSize, MaxDistance = rMessage.GlareMaxDistance, Color = rMessage.Color, Direction = rMessage.ReflectorDirection, Range = rMessage.Range }); } } break; } case MyRenderMessageEnum.SetLightShadowIgnore: { var rMessage = (MyRenderMessageSetLightShadowIgnore)message; var light = MyLights.Get(rMessage.ID); var actor = MyIDTracker <MyActor> .FindByID(rMessage.ID2); if (light != LightId.NULL && actor != null) { if (!MyLights.IgnoredEntitites.ContainsKey(light)) { MyLights.IgnoredEntitites[light] = new HashSet <uint>(); } MyLights.IgnoredEntitites[light].Add(rMessage.ID2); } break; } case MyRenderMessageEnum.ClearLightShadowIgnore: { var rMessage = (MyRenderMessageClearLightShadowIgnore)message; var light = MyLights.Get(rMessage.ID); if (light != LightId.NULL) { MyLights.IgnoredEntitites.Remove(light); } break; } case MyRenderMessageEnum.UpdateFogSettings: { var rMessage = (MyRenderMessageUpdateFogSettings)message; MyEnvironment.FogSettings = rMessage.Settings; break; } case MyRenderMessageEnum.UpdateRenderEnvironment: { var rMessage = (MyRenderMessageUpdateRenderEnvironment)message; MyEnvironment.DirectionalLightDir = VRageMath.Vector3.Normalize(rMessage.SunDirection); MyEnvironment.DirectionalLightIntensity = rMessage.SunIntensity * rMessage.SunColor.ToVector3(); MyEnvironment.DirectionalLightEnabled = rMessage.SunLightOn; MyEnvironment.DayTime = (float)(rMessage.DayTime - Math.Truncate(rMessage.DayTime)); MyEnvironment.SunDistance = rMessage.DistanceToSun; MyEnvironment.SunColor = rMessage.SunColor; MyEnvironment.SunMaterial = rMessage.SunMaterial; MyEnvironment.SunSizeMultiplier = rMessage.SunSizeMultiplier; var skybox = rMessage.BackgroundTexture; m_resetEyeAdaptation = m_resetEyeAdaptation || rMessage.ResetEyeAdaptation; break; } case MyRenderMessageEnum.UpdateEnvironmentMap: { break; } case MyRenderMessageEnum.UpdatePostprocessSettings: { var rMessage = (MyRenderMessageUpdatePostprocessSettings)message; m_postprocessSettings = rMessage.Settings; break; } case MyRenderMessageEnum.UpdateSSAOSettings: { var rMessage = (MyRenderMessageUpdateSSAOSettings)message; MySSAO.Params.MinRadius = rMessage.MinRadius; MySSAO.Params.MaxRadius = rMessage.MaxRadius; MySSAO.Params.RadiusGrow = rMessage.RadiusGrowZScale; MySSAO.Params.RadiusBias = rMessage.Bias; MySSAO.Params.Falloff = rMessage.Falloff; MySSAO.Params.Normalization = rMessage.NormValue; MySSAO.Params.Contrast = rMessage.Contrast; break; } #endregion #region Sprites case MyRenderMessageEnum.DrawSprite: case MyRenderMessageEnum.DrawSpriteNormalized: case MyRenderMessageEnum.DrawSpriteAtlas: case MyRenderMessageEnum.SpriteScissorPush: case MyRenderMessageEnum.SpriteScissorPop: { m_drawQueue.Enqueue(message); break; } #endregion #region Fonts and text case MyRenderMessageEnum.CreateFont: { var createFontMessage = message as MyRenderMessageCreateFont; Debug.Assert(createFontMessage != null); var renderFont = new MyRenderFont(createFontMessage.FontPath); renderFont.LoadContent(); AddFont(createFontMessage.FontId, renderFont, createFontMessage.IsDebugFont); break; } case MyRenderMessageEnum.DrawString: { m_drawQueue.Enqueue(message); break; } #endregion #region Textures case MyRenderMessageEnum.PreloadTextures: { var preloadMsg = message as MyRenderMessagePreloadTextures; //MyTextureManager.PreloadTextures(preloadMsg.InDirectory, preloadMsg.Recursive); //MyTextures.UnloadTexture(texMessage.Texture); break; } case MyRenderMessageEnum.UnloadTexture: { var texMessage = (MyRenderMessageUnloadTexture)message; //MyTextureManager.UnloadTexture(texMessage.Texture); MyTextures.UnloadTexture(texMessage.Texture); break; } case MyRenderMessageEnum.ReloadTextures: { var reloadMsg = (MyRenderMessageReloadTextures)message; MyVoxelMaterials1.InvalidateMaterials(); MyMeshMaterials1.InvalidateMaterials(); MyTextures.ReloadAssetTextures(); //MyTextureManager.UnloadTextures(); //MyMaterialProxyFactory.ReloadTextures(); break; } case MyRenderMessageEnum.ReloadModels: { var reloadMsg = (MyRenderMessageReloadModels)message; //MyMaterials.Clear(); MyAssetsLoader.ReloadMeshes(); MyRenderableComponent.MarkAllDirty(); break; } #endregion case MyRenderMessageEnum.TakeScreenshot: { var rMessage = (MyRenderMessageTakeScreenshot)message; m_screenshot = new MyScreenshot(rMessage.PathToSave, rMessage.SizeMultiplier, rMessage.IgnoreSprites); break; } case MyRenderMessageEnum.ReloadEffects: { m_reloadShaders = true; //MyShaderBundleFactory.ClearCache(); //MyShaderMaterial.ClearCache(); //MyShaderPass.ClearCache(); MyShaders.Recompile(); MyMaterialShaders.Recompile(); MyRenderableComponent.MarkAllDirty(); foreach (var f in MyComponentFactory <MyFoliageComponent> .GetAll()) { f.Dispose(); } break; } case MyRenderMessageEnum.PlayVideo: { var rMessage = (MyRenderMessagePlayVideo)message; MyVideoFactory.Create(rMessage.ID, rMessage.VideoFile); var video = MyVideoFactory.Videos.Get(rMessage.ID); if (video != null) { video.Volume = rMessage.Volume; } break; } case MyRenderMessageEnum.CloseVideo: { var rMessage = (MyRenderMessageCloseVideo)message; var video = MyVideoFactory.Videos.Get(rMessage.ID); if (video != null) { video.Stop(); video.Dispose(); MyVideoFactory.Videos.Remove(rMessage.ID); } break; } case MyRenderMessageEnum.DrawVideo: { var rMessage = (MyRenderMessageDrawVideo)message; var video = MyVideoFactory.Videos.Get(rMessage.ID); if (video != null) { video.Draw(rMessage.Rectangle, rMessage.Color, rMessage.FitMode); } break; } case MyRenderMessageEnum.UpdateVideo: { var rMessage = (MyRenderMessageUpdateVideo)message; var video = MyVideoFactory.Videos.Get(rMessage.ID); if (video != null) { video.Update(); } break; } case MyRenderMessageEnum.SetVideoVolume: { var rMessage = (MyRenderMessageSetVideoVolume)message; var video = MyVideoFactory.Videos.Get(rMessage.ID); if (video != null) { video.Volume = rMessage.Volume; } break; } case MyRenderMessageEnum.VideoAdaptersRequest: { MyRenderProxy.SendVideoAdapters(GetAdaptersList()); break; } case MyRenderMessageEnum.SwitchDeviceSettings: { MyRenderProxy.RenderThread.SwitchSettings((message as MyRenderMessageSwitchDeviceSettings).Settings); break; } case MyRenderMessageEnum.SwitchRenderSettings: break; // Can be ignored as we're handling newer version of the message. case MyRenderMessageEnum.SwitchRenderSettings1: { UpdateRenderSettings((message as MyRenderMessageSwitchRenderSettings1).Settings); break; } case MyRenderMessageEnum.UnloadData: { MyRender11.UnloadData(); break; } case MyRenderMessageEnum.CollectGarbage: { GC.Collect(); break; } #region Debug draw case MyRenderMessageEnum.DebugDrawPoint: case MyRenderMessageEnum.DebugDrawLine3D: case MyRenderMessageEnum.DebugDrawLine2D: case MyRenderMessageEnum.DebugDrawSphere: case MyRenderMessageEnum.DebugDrawAABB: case MyRenderMessageEnum.DebugDrawAxis: case MyRenderMessageEnum.DebugDrawOBB: case MyRenderMessageEnum.DebugDrawCone: case MyRenderMessageEnum.DebugDrawTriangle: case MyRenderMessageEnum.DebugDrawCapsule: case MyRenderMessageEnum.DebugDrawText2D: case MyRenderMessageEnum.DebugDrawText3D: case MyRenderMessageEnum.DebugDrawModel: case MyRenderMessageEnum.DebugDrawTriangles: case MyRenderMessageEnum.DebugDrawPlane: case MyRenderMessageEnum.DebugDrawCylinder: { m_debugDrawMessages.Enqueue(message); } break; case MyRenderMessageEnum.DebugCrashRenderThread: { throw new InvalidOperationException("Forced exception"); } #endregion } }
internal void PostProcess(RwTexId postProcessTarget, RwTexId cascadeArray) { m_cascadePostProcessor.GatherArray(postProcessTarget, cascadeArray, m_cascadeInfo, m_csmConstants); }
internal void GatherArray(RwTexId postprocessTarget, RwTexId cascadeArray, MyProjectionInfo[] cascadeInfo, ConstantsBufferId cascadeConstantBuffer) { if (!MyRenderProxy.Settings.EnableShadows || !MyRender11.DebugOverrides.Shadows) { return; } MarkCascadesInStencil(cascadeInfo); MyGpuProfiler.IC_BeginBlock("Cascades postprocess"); MyRenderContext renderContext = MyRenderContext.Immediate; DeviceContext deviceContext = renderContext.DeviceContext; MyShadowsQuality shadowsQuality = MyRender11.RenderSettings.ShadowQuality.GetShadowsQuality(); if (shadowsQuality == MyShadowsQuality.LOW) { renderContext.SetCS(m_gatherCS_LD); } else if (shadowsQuality == MyShadowsQuality.MEDIUM) { renderContext.SetCS(m_gatherCS_MD); } else if (shadowsQuality == MyShadowsQuality.HIGH) { renderContext.SetCS(m_gatherCS_HD); } ComputeShaderId.TmpUav[0] = postprocessTarget.Uav; deviceContext.ComputeShader.SetUnorderedAccessViews(0, ComputeShaderId.TmpUav, ComputeShaderId.TmpCount); deviceContext.ComputeShader.SetShaderResource(0, MyRender11.MultisamplingEnabled ? MyScreenDependants.m_resolvedDepth.m_SRV_depth : MyGBuffer.Main.DepthStencil.m_SRV_depth); deviceContext.ComputeShader.SetShaderResource(1, MyGBuffer.Main.DepthStencil.m_SRV_stencil); deviceContext.ComputeShader.SetSampler(MyCommon.SHADOW_SAMPLER_SLOT, SamplerStates.m_shadowmap); if (!MyStereoRender.Enable) { deviceContext.ComputeShader.SetConstantBuffer(0, MyCommon.FrameConstants); } else { MyStereoRender.CSBindRawCB_FrameConstants(renderContext); } deviceContext.ComputeShader.SetConstantBuffer(4, cascadeConstantBuffer); deviceContext.ComputeShader.SetShaderResource(MyCommon.CASCADES_SM_SLOT, cascadeArray.SRV); Vector2I threadGroups = GetThreadGroupCount(); deviceContext.Dispatch(threadGroups.X, threadGroups.Y, 1); ComputeShaderId.TmpUav[0] = null; renderContext.DeviceContext.ComputeShader.SetUnorderedAccessViews(0, ComputeShaderId.TmpUav, ComputeShaderId.TmpCount); deviceContext.ComputeShader.SetShaderResource(0, null); deviceContext.ComputeShader.SetShaderResource(1, null); if (shadowsQuality == MyShadowsQuality.HIGH && MyRender11.Settings.EnableShadowBlur) { MyBlur.Run(postprocessTarget.Rtv, MyRender11.CascadesHelper.Rtv, MyRender11.CascadesHelper.SRV, postprocessTarget.SRV, depthDiscardThreshold: 0.2f); } MyGpuProfiler.IC_EndBlock(); }