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 example : MonoBehaviour {
IEnumerator Example() {
yield return new WaitForEndOfFrame();
}
}
import UnityEngine
import System.Collections
class example(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 bufferafter 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 example : 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
class example(MonoBehaviour):
def Start():
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 example : 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
class example(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()