Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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);
        }