[Unity基础]RenderTexture

参考链接:

https://www.cnblogs.com/Jimm/p/5951362.html

一.相关API

1.Texture2D.ReadPixels

从RenderTexture.active中复制像素,以左下角为原点。

2.MonoBehaviour.OnPostRender

当相机渲染完所有物体就会调用该方法,并且只有当这个脚本挂在相机时才会调用。

二.测试

新建一个场景,新建一个camera和一个go,把go设置为一个单独的层,让camera单独照这个层,主camera不要照这个层。调整camera的深度和targetTexture。

 1 using UnityEngine;
 2 using System.Collections;
 3 using UnityEngine.UI;
 4 using System.IO;
 5
 6 public class TestRenderTexture : MonoBehaviour {
 7
 8     public Camera camera;
 9     public RawImage rawImage;
10     bool isScreenShot = false;
11
12     void Update()
13     {
14         //将镜头的画面保存到本地
15         if (Input.GetKeyDown(KeyCode.Q))
16         {
17             Texture2D tex = RenderTexture2Texture2D(camera.targetTexture);
18
19             //展示
20             rawImage.texture = tex;
21
22             //保存到本地
23             byte[] bytes = tex.EncodeToPNG();
24             File.WriteAllBytes(Application.dataPath + "/RenderTexture/Test.png", bytes);
25             UnityEditor.AssetDatabase.Refresh();
26         }
27
28         //屏幕截图(方法1)
29         if (Input.GetKeyDown(KeyCode.W))
30         {
31             StartCoroutine(ScreenShotIEnumerator());
32         }
33
34         //屏幕截图(方法2)
35         if (Input.GetKeyDown(KeyCode.E))
36         {
37             isScreenShot = true;
38         }
39     }
40
41     public IEnumerator ScreenShotIEnumerator()
42     {
43         yield return new WaitForEndOfFrame();
44         rawImage.texture = ScreenShot();
45     }
46
47     private void OnPostRender()
48     {
49         //Debug.Log("OnPostRender");
50         if (isScreenShot)
51         {
52             isScreenShot = false;
53             rawImage.texture = ScreenShot();
54         }
55     }
56
57     //屏幕截图
58     public Texture2D ScreenShot()
59     {
60         Texture2D tex = new Texture2D(Screen.width, Screen.height, TextureFormat.ARGB32, false);
61         tex.ReadPixels(new Rect(0, 0, Screen.width, Screen.height), 0, 0);
62         tex.Apply();
63         return tex;
64     }
65
66     //RenderTexture转Texture2D
67     public Texture2D RenderTexture2Texture2D(RenderTexture rt)
68     {
69         RenderTexture preRT = RenderTexture.active;
70         RenderTexture.active = rt;
71         Texture2D tex = new Texture2D(rt.width, rt.height, TextureFormat.ARGB32, false);
72         tex.ReadPixels(new Rect(0, 0, rt.width, rt.height), 0, 0);
73         tex.Apply();
74         RenderTexture.active = preRT;
75         return tex;
76     }
77 }

原文地址:https://www.cnblogs.com/lyh916/p/9058403.html

时间: 2024-11-10 02:17:23

[Unity基础]RenderTexture的相关文章

Unity基础 随机数的使用

脚本语言:C# 一个比较常用的例子是游戏中的主角碰到场景中的NPC时,NPC会随机做出反应,例如有50%几率来友好的致敬,25%几率走开,20%几率反身攻击和%%的几率赠送礼物. 创建一个NPCTest脚本,用于模拟NPC动作: using UnityEngine; using System.Collections; public class NPCTest : MonoBehaviour { //NPC动作几率 float[] probArray = {0.5f , 0.25f , 0.2f

Unity基础 用C#脚本读取JSON文件数据

读取JSON文件数据网上有很多方法吗,这里采用SimpleJSON,关于SimpleJSON的介绍参考以下链接:http://wiki.unity3d.com/index.php/SimpleJSON,使用之前要先导入SimpleJSON的相关文件. JSON文件名:achieve.json,文件内容: { "30002":{"achieve_id":30002,"achieve_name":"连胜","achiev

unity基础开发----unity游戏速度更快的简易检查表

让游戏速度更快的简易检查表 保持顶点数在 200K 下面,针对 PC 时每帧应为 3M,主要取决于目标 GPU. 若使用内置着色器,请在移动 (Mobile) 或未点亮 (Unlit) 的类别中选择.它们对非移动平台相同有效,可是是更复杂的着色器的简化和限制版本号. 每一个场景中不同材质的数量尽可能少 - 不同对象之间尽可能共享相同的材质. 在非移动对象上设置静态 (Static) 属性,同意静态批处理 (static batching) 等内部优化. 切勿在不必要的情况下使用像素灯 - 选择仅

Unity基础 Time的使用

脚本语言:C# 1.deltatime: deltatime它表示距上一次调用Update或FixedUpdate所用的时间,调用deltatime可以使物体的旋转以一种恒定的速度来运行,而不受帧速率的控制或计算机性能的影响. 2.time变量的使用: 表示自游戏开始以来所经历的时间. 3.实例: 创建一个脚本TimeShow,添加到主摄像机物体Main Camera中,脚本代码如下: using UnityEngine; using System.Collections; public cla

Unity基础 NGUI插件 创建简单的按钮

Unity版本:4.5.1 NGUI版本:3.6.5 注意NGUI版本,网上的大部分教程都是2.x版本的,在步骤上面略有不同,此文适合初学者. 示例: 通过NGUI创建一个背景和按钮. 1.首先创建一个新场景,并保存,在此场景取名为Test: 在Unity主界面上:File — New Scene,然后保存场景,File — Save Scene As.. 在此,场景命名为Test,可以在Unity中看到如下效果:      2.网上的绝大部分教程都说要删除场景中的自带摄像机,即上文左侧图中的

Unity基础 C# 游戏间物体间的访问

脚本语言:C# 1.在Unity工程中新建两个物体:Cube和Sphere 2.分别为Cube和Sphere添加脚本CubeScript和SphereScript: 在SphereScript这两个定义一个函数DoSomething(),脚本具体代码如下: using UnityEngine; using System.Collections; public class SphereScript : MonoBehaviour { public int radius = 5; // Use th

Unity 基础

Unity 基础是unity入门的关键.他将讲解Unity的界面, 菜单项,使用资源,创设场景,并发布版本. 当你读完这段,你将理解unity是怎么工作的,如何有效地使用它,并且完成一个基本的游戏. 学习界面 花点时间在编辑器界面上并且熟悉他,在unity视图中主界面由几个面板组成 Toolbar:工具栏 Scene:场景视图 Hierarchy:层级视图(当前场景的对象) Project:项目视图 Inspector:属性窗口(检查窗口) 原文 This section is your key

Unity基础 NGUI 图集Atlas制作

unity版本:4.5 NGUI版本:3.6.5 1.选择要制作的图片放到对应目录下,在Asset下新建一个文件夹Picture用于放置图片: 2.选中一张图片,打开Atlas Maker: 3.单击窗口中的Create按钮,选择一个路径保存,在这里我们新建一个文件夹Prefabs用于保存生成的文件,可以看到Prefabs文件夹下生成了对应的3个文件: 如果还需要创建其他的Atlas则重复2.3步骤: 4.用NGUI依次创建: 在Panel下新建一个Button来测试: 搜索simple but

Unity基础 GUI编程

脚本语言:C# 附上一张图说明Unity GUI编程中可用的控件:(可能有遗漏) 下面列出一些例子来说明: 1.Groups : 在固定Layout模式中起到组织可用项的功能,它让你在屏幕的一个区域中包含多个控件.把定义的控件放在GUI.BeginGroup()和 GUI.EndGroup()这对函数中间,所有控件的位置坐标都以Groups的0坐标为起点,假如更改了group坐标,那么内部的控件也会跟随改变. 示例代码: using UnityEngine; using System.Colle