public Material GetLightMappedMaterial(Material baseMaterial, LightMapReference lightMapRef) { var flags = LightMappingFlags.Lightmapped; if (lightMapRef.LightMaps.hasDirections) { flags |= LightMappingFlags.Directional; } if (lightMapRef.LightMaps.hasShadowMask) { flags |= LightMappingFlags.ShadowMask; } var key = new MaterialLookupKey { BaseMaterial = baseMaterial, LightMaps = lightMapRef.LightMaps, Flags = flags }; if (m_LightMappedMaterialCache.TryGetValue(key, out var lightMappedMaterial)) { ++m_NumLightMappedMaterialCacheHits; return(lightMappedMaterial); } else { ++m_NumLightMappedMaterialCacheMisses; lightMappedMaterial = CreateLightMappedMaterial(baseMaterial, lightMapRef.LightMaps); m_LightMappedMaterialCache[key] = lightMappedMaterial; return(lightMappedMaterial); } }
private static void AddComponentsToEntity( Entity entity, EntityManager dstEntityManager, GameObjectConversionSystem conversionSystem, Renderer meshRenderer, Mesh mesh, List <Material> materials, Dictionary <MaterialLookupKey, Material> createdMaterials, bool flipWinding, int id, LightMaps lightMaps, int lightmapIndex, AABB localBounds) { var needMotionVectorPass = (meshRenderer.motionVectorGenerationMode == MotionVectorGenerationMode.Object) || (meshRenderer.motionVectorGenerationMode == MotionVectorGenerationMode.ForceNoMotion); var renderMesh = new RenderMesh { mesh = mesh, castShadows = meshRenderer.shadowCastingMode, receiveShadows = meshRenderer.receiveShadows, layer = meshRenderer.gameObject.layer, subMesh = id, needMotionVectorPass = needMotionVectorPass }; var staticLightingMode = StaticLightingMode.None; if (meshRenderer.lightmapIndex >= 65534 || meshRenderer.lightmapIndex < 0) { staticLightingMode = StaticLightingMode.LightProbes; } else if (meshRenderer.lightmapIndex >= 0) { staticLightingMode = StaticLightingMode.Lightmapped; } dstEntityManager.AddComponentData(entity, new PerInstanceCullingTag()); dstEntityManager.AddComponentData(entity, new RenderBounds { Value = localBounds }); var material = materials[id]; if (staticLightingMode == StaticLightingMode.Lightmapped && lightMaps.isValid) { conversionSystem.DeclareAssetDependency(meshRenderer.gameObject, material); var localFlags = LightMappingFlags.Lightmapped; if (lightMaps.hasDirections) { localFlags |= LightMappingFlags.Directional; } if (lightMaps.hasShadowMask) { localFlags |= LightMappingFlags.ShadowMask; } var key = new MaterialLookupKey { BaseMaterial = materials[id], lightmaps = lightMaps, Flags = localFlags }; var lookUp = createdMaterials ?? new Dictionary <MaterialLookupKey, Material>(); if (lookUp.TryGetValue(key, out Material result)) { material = result; } else { material = new Material(materials[id]); material.name = $"{material.name}_Lightmapped_"; material.EnableKeyword("LIGHTMAP_ON"); material.SetTexture("unity_Lightmaps", lightMaps.colors); material.SetTexture("unity_LightmapsInd", lightMaps.directions); material.SetTexture("unity_ShadowMasks", lightMaps.shadowMasks); if (lightMaps.hasDirections) { material.name = material.name + "_DIRLIGHTMAP"; material.EnableKeyword("DIRLIGHTMAP_COMBINED"); } if (lightMaps.hasShadowMask) { material.name = material.name + "_SHADOW_MASK"; } lookUp[key] = material; } dstEntityManager.AddComponentData(entity, new BuiltinMaterialPropertyUnity_LightmapST() { Value = meshRenderer.lightmapScaleOffset }); dstEntityManager.AddComponentData(entity, new BuiltinMaterialPropertyUnity_LightmapIndex() { Value = lightmapIndex }); dstEntityManager.AddSharedComponentData(entity, lightMaps); } else if (staticLightingMode == StaticLightingMode.LightProbes) { if (meshRenderer.lightProbeUsage == LightProbeUsage.CustomProvided) { dstEntityManager.AddComponent <CustomProbeTag>(entity); } else if (meshRenderer.lightProbeUsage == LightProbeUsage.BlendProbes && LightmapSettings.lightProbes != null && LightmapSettings.lightProbes.count > 0) { dstEntityManager.AddComponent <BlendProbeTag>(entity); } else { dstEntityManager.AddComponent <AmbientProbeTag>(entity); } } renderMesh.material = material; dstEntityManager.AddSharedComponentData(entity, renderMesh); if (flipWinding) { dstEntityManager.AddComponent(entity, ComponentType.ReadWrite <RenderMeshFlippedWindingTag>()); } conversionSystem.ConfigureEditorRenderData(entity, meshRenderer.gameObject, true); #if ENABLE_HYBRID_RENDERER_V2 dstEntityManager.AddComponent(entity, ComponentType.ReadOnly <WorldToLocal_Tag>()); #if HDRP_9_0_0_OR_NEWER // HDRP previous frame matrices (for motion vectors) if (needMotionVectorPass) { dstEntityManager.AddComponent(entity, ComponentType.ReadWrite <BuiltinMaterialPropertyUnity_MatrixPreviousM>()); dstEntityManager.AddComponent(entity, ComponentType.ReadWrite <BuiltinMaterialPropertyUnity_MatrixPreviousMI_Tag>()); } dstEntityManager.AddComponentData(entity, CreateMotionVectorsParams(ref renderMesh, ref meshRenderer)); #endif dstEntityManager.AddComponentData(entity, new BuiltinMaterialPropertyUnity_RenderingLayer { Value = new uint4(meshRenderer.renderingLayerMask, 0, 0, 0) }); dstEntityManager.AddComponentData(entity, new BuiltinMaterialPropertyUnity_WorldTransformParams { Value = flipWinding ? new float4(0, 0, 0, -1) : new float4(0, 0, 0, 1) }); #if URP_9_0_0_OR_NEWER // Default initialized light data for URP dstEntityManager.AddComponentData(entity, new BuiltinMaterialPropertyUnity_LightData { Value = new float4(0, 0, 1, 0) }); #endif #endif }