Пример #1
0
        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);
        }
Пример #2
0
        /// <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);
        }