in unity/Assets/PostProcessingV2/Editor/PostProcessLayerEditor.cs [336:400]
void ExportFrameToExr(ExportMode mode)
{
string path = EditorUtility.SaveFilePanel("Export EXR...", "", "Frame", "exr");
if (string.IsNullOrEmpty(path))
return;
EditorUtility.DisplayProgressBar("Export EXR", "Rendering...", 0f);
var camera = m_Target.GetComponent<Camera>();
var w = camera.pixelWidth;
var h = camera.pixelHeight;
var texOut = new Texture2D(w, h, TextureFormat.RGBAFloat, false, true);
var target = RenderTexture.GetTemporary(w, h, 24, RenderTextureFormat.ARGBFloat, RenderTextureReadWrite.Linear);
var lastActive = RenderTexture.active;
var lastTargetSet = camera.targetTexture;
var lastPostFXState = m_Target.enabled;
var lastBreakColorGradingState = m_Target.breakBeforeColorGrading;
if (mode == ExportMode.DisablePost)
m_Target.enabled = false;
else if (mode == ExportMode.BreakBeforeColorGradingLinear || mode == ExportMode.BreakBeforeColorGradingLog)
m_Target.breakBeforeColorGrading = true;
camera.targetTexture = target;
camera.Render();
camera.targetTexture = lastTargetSet;
EditorUtility.DisplayProgressBar("Export EXR", "Reading...", 0.25f);
m_Target.enabled = lastPostFXState;
m_Target.breakBeforeColorGrading = lastBreakColorGradingState;
if (mode == ExportMode.BreakBeforeColorGradingLog)
{
// Convert to log
var material = new Material(Shader.Find("Hidden/PostProcessing/Editor/ConvertToLog"));
var newTarget = RenderTexture.GetTemporary(w, h, 0, RenderTextureFormat.ARGBFloat, RenderTextureReadWrite.Linear);
Graphics.Blit(target, newTarget, material, 0);
RenderTexture.ReleaseTemporary(target);
DestroyImmediate(material);
target = newTarget;
}
RenderTexture.active = target;
texOut.ReadPixels(new Rect(0, 0, w, h), 0, 0);
texOut.Apply();
RenderTexture.active = lastActive;
EditorUtility.DisplayProgressBar("Export EXR", "Encoding...", 0.5f);
var bytes = texOut.EncodeToEXR(EXRFlags.OutputAsFloat | EXRFlags.CompressZIP);
EditorUtility.DisplayProgressBar("Export EXR", "Saving...", 0.75f);
File.WriteAllBytes(path, bytes);
EditorUtility.ClearProgressBar();
AssetDatabase.Refresh();
RenderTexture.ReleaseTemporary(target);
DestroyImmediate(texOut);
}