返回介绍

WaitForEndOfFrame 等待帧结束

发布于 2019-12-18 15:38:45 字数 6243 浏览 1144 评论 0 收藏 0

Namespace: UnityEngine

Inherits from: YieldInstruction

Description 描述

Waits until the end of the frame after all cameras and GUI is rendered, just before displaying the frame on screen.

等待直到所有的摄像机和GUI被渲染完成后,在该帧显示在屏幕之前。

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.

你可以使用它读取显示到纹理,编码它为一个图片文件(参见Texture2D.ReadPixels和Texture2D.EncodeToPNG)并且发送到任意地方。

JavaScript:

yield new WaitForEndOfFrame ();

C#:

using UnityEngine;
using System.Collections;
 
public class ExampleClass : MonoBehaviour {
    IEnumerator Example() {
        yield return new WaitForEndOfFrame();
    }
}

另一个例子:

JavaScript:

// 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");
}

C#:

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");
    }
}
using UnityEngine;
using System.Collections;
 
public class ExampleClass : MonoBehaviour
{
    // A script that shows destination alpha channel in the game view.
 
    Material mat;
 
    void CreateMaterial ()
    {
        // Unity has a built-in shader that is useful for drawing
        // simple colored things. In this case, we just want to use
        // a blend mode that inverts destination colors.			
        var shader = Shader.Find ("Hidden/Internal-Colored");
        mat = new Material (shader);
        mat.hideFlags = HideFlags.HideAndDontSave;
        // Set blend mode to show destination alpha channel.
        mat.SetInt ("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.DstAlpha);
        mat.SetInt ("_DstBlend", (int)UnityEngine.Rendering.BlendMode.Zero);
        // Turn off backface culling, depth writes, depth test.
        mat.SetInt ("_Cull", (int)UnityEngine.Rendering.CullMode.Off);
        mat.SetInt ("_ZWrite", 0);
        mat.SetInt ("_ZTest", (int)UnityEngine.Rendering.CompareFunction.Always);
    }
 
 
    public IEnumerator Start ()
    {
        CreateMaterial ();
        while (true)
        {
            // Wait until all rendering + UI is done.
            yield return new WaitForEndOfFrame ();
            // Draw a quad that shows alpha channel.
            GL.PushMatrix ();
            GL.LoadOrtho ();
            mat.SetPass (0);
            GL.Begin (GL.QUADS);
            GL.Vertex3 (0, 0, 0);
            GL.Vertex3 (1, 0, 0);
            GL.Vertex3 (1, 1, 0);
            GL.Vertex3 (0, 1, 0);
            GL.End ();
            GL.PopMatrix ();
        }
    }
 
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文