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(); } }
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 { // Take a shot immediately IEnumerator Start() { UploadPNG(); } IEnumerator UploadPNG() { // We should only read the screen buffer after rendering is complete yield return new WaitForEndOfFrame();
// Create a texture the size of the screen, RGB24 format int width = Screen.width; int height = Screen.height; Texture2D tex = new Texture2D(width, height, TextureFormat.RGB24, false);
// Read screen contents into the texture tex.ReadPixels(new Rect(0, 0, width, height), 0, 0); tex.Apply();
// Encode texture into PNG byte[] 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 WWWForm form = new WWWForm(); form.AddField("frameCount", Time.frameCount.ToString()); form.AddBinaryData("fileUpload", bytes);
// Upload to a cgi script 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"); } }
// 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;
// After the frame is completely rendered, we'll // draw a full screen quad that extracts the alpha channel. 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(); } } }