private void GenerateShadowsGenerator(Light light, float progress) { var generator = new BabylonShadowGenerator { lightId = GetID(light.gameObject), mapSize = exportationOptions.ShadowMapSize, blurScale = exportationOptions.ShadowBlurScale, bias = exportationOptions.ShadowMapBias, forceBackFacesOnly = false }; BabylonLightingFilter filter = (BabylonLightingFilter)exportationOptions.DefaultLightFilter; switch (filter) { case BabylonLightingFilter.PoissonSampling: generator.usePoissonSampling = true; break; case BabylonLightingFilter.VarianceShadowMap: generator.useVarianceShadowMap = true; break; case BabylonLightingFilter.BlurVarianceShadowMap: generator.useBlurVarianceShadowMap = true; break; case BabylonLightingFilter.SoftPoissonSampling: generator.usePoissonSampling = (light.shadows == LightShadows.Soft); break; } var renderList = new List <string>(); foreach (var gameObject in gameObjects) { var shadowBake = gameObject.GetComponent <BabylonShadowBake>(); bool realtimeShadows = (shadowBake != null && shadowBake.shadowOption == BabylonShadowOptions.Realtime); if (realtimeShadows) { var renderer = gameObject.GetComponent <Renderer>(); var meshFilter = gameObject.GetComponent <MeshFilter>(); if (meshFilter != null && renderer != null && renderer.shadowCastingMode != ShadowCastingMode.Off) { renderList.Add(GetID(gameObject)); continue; } var skinnedMesh = gameObject.GetComponent <SkinnedMeshRenderer>(); if (skinnedMesh != null && renderer != null && renderer.shadowCastingMode != ShadowCastingMode.Off) { renderList.Add(GetID(gameObject)); } } } generator.renderList = renderList.ToArray(); babylonScene.ShadowGeneratorsList.Add(generator); }
private void GenerateShadowsGenerator(BabylonLight babylonLight, Light light, float progress) { BabylonLightingFilter shadowMapFilter = BabylonLightingFilter.BlurCloseExponentialShadowMap; int shadowMapSize = 1024; float shadowMapBias = 0.00005f; float normalMapBias = 0.0f; float shadowNearPlane = 0.1f; float shadowFarPlane = 100.0f; bool shadowKernelBlur = false; float shadowBlurKernel = 1.0f; float shadowBlurScale = 2.0f; float shadowBlurOffset = 0.0f; float shadowOrthoScale = 0.1f; float shadowStrengthScale = 1.0f; float shadowDepthScale = 50.0f; float frustumEdgeFalloff = 0.0f; bool forceBackFacesOnly = true; bool transparencyShadow = false; float contactHardening = 0.1f; var shadows = light.gameObject.GetComponent <UnityEditor.ShadowGenerator>(); if (shadows != null && shadows.isActiveAndEnabled) { shadowMapSize = shadows.shadowMapSize; shadowMapBias = shadows.shadowMapBias; normalMapBias = shadows.shadowNormBias; shadowNearPlane = shadows.shadowNearPlane; shadowFarPlane = shadows.shadowFarPlane; shadowMapFilter = shadows.shadowMapFilter; shadowKernelBlur = shadows.shadowKernelBlur; shadowBlurKernel = shadows.shadowBlurKernel; shadowBlurScale = shadows.shadowBlurScale; shadowBlurOffset = shadows.shadowBlurOffset; shadowOrthoScale = shadows.shadowOrthoScale; shadowStrengthScale = shadows.shadowStrengthScale; shadowDepthScale = shadows.shadowDepthScale; forceBackFacesOnly = shadows.forceBackFacesOnly; transparencyShadow = shadows.transparencyShadow; contactHardening = shadows.contactHardening; frustumEdgeFalloff = shadows.frustumEdgeFalloff; } babylonLight.shadowMinZ = shadowNearPlane; babylonLight.shadowMaxZ = shadowFarPlane; if (babylonLight is BabylonDirectionalLight) { ((BabylonDirectionalLight)babylonLight).shadowOrthoScale = shadowOrthoScale; } float strength = light.shadowStrength * shadowStrengthScale; var generator = new BabylonExport.Entities.BabylonShadowGenerator { lightId = GetID(light.gameObject), bias = shadowMapBias, normalBias = normalMapBias, mapSize = shadowMapSize, darkness = (1.0f - strength), depthScale = shadowDepthScale, blurScale = shadowBlurScale, blurKernel = shadowBlurKernel, blurBoxOffset = shadowBlurOffset, useKernelBlur = shadowKernelBlur, forceBackFacesOnly = forceBackFacesOnly, transparencyShadow = transparencyShadow, frustumEdgeFalloff = frustumEdgeFalloff, contactHardeningLightSizeUVRatio = contactHardening }; switch (shadowMapFilter) { case BabylonLightingFilter.PoissonSampling: generator.usePoissonSampling = true; break; case BabylonLightingFilter.ExponentialShadowMap: generator.useExponentialShadowMap = true; break; case BabylonLightingFilter.BlurExponentialShadowMap: generator.useBlurExponentialShadowMap = true; break; case BabylonLightingFilter.CloseExponentialShadowMap: generator.useCloseExponentialShadowMap = true; break; case BabylonLightingFilter.BlurCloseExponentialShadowMap: generator.useBlurCloseExponentialShadowMap = true; break; case BabylonLightingFilter.PercentageCloserFiltering: generator.usePercentageCloserFiltering = true; break; case BabylonLightingFilter.ContactHardeningShadowMap: generator.useContactHardeningShadow = true; break; } // .. // Light Shadow Generator Render List (TODO: Support Specific Meshes Or Layers Or Tags) // .. var renderList = new List <string>(); renderList.Add(rootInstance.id); foreach (var gameObject in gameObjects) { if (gameObject.layer != ExporterWindow.PrefabIndex) { if (!gameObject.IsLightapStatic()) { var meshFilter = gameObject.GetComponent <MeshFilter>(); var meshRender = gameObject.GetComponent <MeshRenderer>(); if (meshFilter != null && meshRender != null && meshRender.enabled == true && meshRender.shadowCastingMode != ShadowCastingMode.Off) { renderList.Add(GetID(gameObject)); continue; } var skinnedMesh = gameObject.GetComponent <SkinnedMeshRenderer>(); if (skinnedMesh != null && skinnedMesh.enabled == true && skinnedMesh.shadowCastingMode != ShadowCastingMode.Off) { renderList.Add(GetID(gameObject)); } } } } generator.renderList = renderList.ToArray(); babylonScene.ShadowGeneratorsList.Add(generator); }