Waits until the end of the frame after all cameras and GUI is rendered, just before displaying the frame on screen.
You can use it to read the display into a texture, encode it as an image file (see Texture2D.ReadPixels and Texture2D.EncodeToPNG) and send it somewhere.
yield new WaitForEndOfFrame ();
using UnityEngine; using System.Collections; public class ExampleClass : MonoBehaviour { IEnumerator Example() { yield return new WaitForEndOfFrame(); } }
import UnityEngine import System.Collections public class ExampleClass(MonoBehaviour): def Example() as IEnumerator: yield WaitForEndOfFrame()
Another example:
// Saves screenshot as PNG file. import System.IO;// Take a shot immediately function Start() { UploadPNG(); }function UploadPNG() { // We should only read the screen buffer after rendering is complete yield WaitForEndOfFrame(); // Create a texture the size of the screen, RGB24 format var width = Screen.width; var height = Screen.height; var tex = new Texture2D( width, height, TextureFormat.RGB24, false ); // Read screen contents into the texture tex.ReadPixels( Rect(0, 0, width, height), 0, 0 ); tex.Apply(); // Encode texture into PNG var bytes = tex.EncodeToPNG(); Destroy( tex ); // For testing purposes, also write to a file in the project folder // File.WriteAllBytes(Application.dataPath + "/../SavedScreen.png", bytes); // Create a Web Form var form = new WWWForm(); form.AddField("frameCount", Time.frameCount.ToString()); form.AddBinaryData("fileUpload",bytes); // Upload to a cgi script var w = WWW("http://localhost/cgi-bin/env.cgi?post", form); yield w; if (w.error != null) print(w.error); else print("Finished Uploading Screenshot"); }
using System.IO; using UnityEngine; using System.Collections; public class ExampleClass : MonoBehaviour { void Start() { UploadPNG(); } IEnumerator UploadPNG() { yield return new WaitForEndOfFrame(); int width = Screen.width; int height = Screen.height; Texture2D tex = new Texture2D(width, height, TextureFormat.RGB24, false); tex.ReadPixels(new Rect(0, 0, width, height), 0, 0); tex.Apply(); byte[] bytes = tex.EncodeToPNG(); Destroy(tex); WWWForm form = new WWWForm(); form.AddField("frameCount", Time.frameCount.ToString()); form.AddBinaryData("fileUpload", bytes); WWW w = new WWW("http://localhost/cgi-bin/env.cgi?post", form); yield return w; if (w.error != null) print(w.error); else print("Finished Uploading Screenshot"); } }
import System.IO import UnityEngine import System.Collections public class ExampleClass(MonoBehaviour): def Start() as void: UploadPNG() def UploadPNG() as IEnumerator: yield WaitForEndOfFrame() width as int = Screen.width height as int = Screen.height tex as Texture2D = Texture2D(width, height, TextureFormat.RGB24, false) tex.ReadPixels(Rect(0, 0, width, height), 0, 0) tex.Apply() bytes as (byte) = tex.EncodeToPNG() Destroy(tex) form as WWWForm = WWWForm() form.AddField('frameCount', Time.frameCount.ToString()) form.AddBinaryData('fileUpload', bytes) w as WWW = WWW('http://localhost/cgi-bin/env.cgi?post', form) yield w if w.error != null: print(w.error) else: print('Finished Uploading Screenshot')
// Shows alpha channel contents in the game view.private var mat : Material;// After the frame is completely rendered, we'll // draw a full screen quad that extracts the alpha channel. function Start() { while (true) { yield WaitForEndOfFrame(); if( !mat ) { mat = new Material( "Shader \"Hidden/Alpha\" {" + "SubShader {" + " Pass {" + " ZTest Always Cull Off ZWrite Off" + " Blend DstAlpha Zero" + " Color (1,1,1,1)" + " }" + "}" + "}" ); } GL.PushMatrix (); GL.LoadOrtho (); for (var i = 0; i < mat.passCount; ++i) { mat.SetPass (i); GL.Begin( GL.QUADS ); GL.Vertex3( 0, 0, 0.1 ); GL.Vertex3( 1, 0, 0.1 ); GL.Vertex3( 1, 1, 0.1 ); GL.Vertex3( 0, 1, 0.1 ); GL.End(); } GL.PopMatrix (); } }
using UnityEngine; using System.Collections; public class ExampleClass : MonoBehaviour { private Material mat; IEnumerator Start() { while (true) { yield return new WaitForEndOfFrame(); if (!mat) mat = new Material("Shader \"Hidden/Alpha\" {" + "SubShader {" + " Pass {" + " ZTest Always Cull Off ZWrite Off" + " Blend DstAlpha Zero" + " Color (1,1,1,1)" + " }" + "}" + "}"); GL.PushMatrix(); GL.LoadOrtho(); int i = 0; while (i < mat.passCount) { mat.SetPass(i); GL.Begin(GL.QUADS); GL.Vertex3(0, 0, 0.1F); GL.Vertex3(1, 0, 0.1F); GL.Vertex3(1, 1, 0.1F); GL.Vertex3(0, 1, 0.1F); GL.End(); ++i; } GL.PopMatrix(); } } }
import UnityEngine import System.Collections public class ExampleClass(MonoBehaviour): private mat as Material def Start() as IEnumerator: while true: yield WaitForEndOfFrame() if not mat: mat = Material((((((((('Shader "Hidden/Alpha" {' + 'SubShader {') + ' Pass {') + ' ZTest Always Cull Off ZWrite Off') + ' Blend DstAlpha Zero') + ' Color (1,1,1,1)') + ' }') + '}') + '}')) GL.PushMatrix() GL.LoadOrtho() i as int = 0 while i < mat.passCount: mat.SetPass(i) GL.Begin(GL.QUADS) GL.Vertex3(0, 0, 0.1F) GL.Vertex3(1, 0, 0.1F) GL.Vertex3(1, 1, 0.1F) GL.Vertex3(0, 1, 0.1F) GL.End() ++i GL.PopMatrix()