public void Init(Shader bakeShader, Shader mixShader, BakeSettings settings) { m_Camera = GetComponent <Camera>(); m_CommandBuffer = new CommandBuffer(); m_Camera.AddCommandBuffer(CameraEvent.AfterImageEffectsOpaque, m_CommandBuffer); m_BakeMaterial = new Material(bakeShader); m_MixMaterial = new Material(mixShader); float weight = 1.0f / (settings.numSamples * 3); m_MixMaterial.SetFloat("_MixFactor", weight); m_BakeMaterial.SetFloat("_TraceRadius", settings.traceRadius); m_BakeMaterial.SetFloat("_CullBack", settings.cullBack ? 1.0f : 0.0f); m_PreTex = RenderTexture.GetTemporary(settings.aoMapSize, settings.aoMapSize); m_PreTex.DiscardContents(true, true); m_Settings = settings; m_Sampler = CreateSampler(settings.samplerType, settings.numSamples); }
/// <summary> /// 烘焙场景 /// </summary> /// <param name="target"></param> /// <param name="batches"></param> /// <param name="settings"></param> /// <returns></returns> public static Texture2D BakeScene(MeshRenderer target, List <AOBakeBatch> batches, BakeSettings settings) { if (batches == null || batches.Count <= 0) { return(null); } if (!target) { return(null); } Shader bakeShader = AssetDatabase.LoadAssetAtPath <Shader>(AOBakeConstants.kAOBakeShader); Shader mixShader = AssetDatabase.LoadAssetAtPath <Shader>(AOBakeConstants.kAOMixShader); if (!bakeShader) { Debug.LogError("Shader Missing! :" + AOBakeConstants.kAOBakeShader); return(null); } if (!mixShader) { Debug.LogError("Shader Missing! :" + AOBakeConstants.kAOMixShader); return(null); } Camera cam = new GameObject("[BakeCam]").AddComponent <Camera>(); cam.gameObject.hideFlags = HideFlags.HideAndDontSave; cam.enabled = false; cam.clearFlags = CameraClearFlags.SolidColor; cam.cullingMask = 0; cam.backgroundColor = new Color(0, 0, 0, 0); var script = cam.gameObject.AddComponent <AOBakeCamera>(); script.Init(bakeShader, mixShader, settings); var result = script.Render(batches, target, RaytracingCallBack); Texture2D texture = null; if (result) { texture = RenderTextureToTexture(result); RenderTexture.ReleaseTemporary(result); } Object.DestroyImmediate(cam.gameObject); EditorUtility.ClearProgressBar(); return(texture); }