|
创建GetImage脚本,将脚本挂到模型中,然后在mainCam的选项中选择需要拍照的相机,最后播放场景,按关键按键进行拍照
using UnityEngine;using System.Collections;using System.IO; public class GetImage : MonoBehaviour{ public Camera mainCam; //待截图的目标摄像机 RenderTexture rt; //声明一个截图时候用的中间变量 Texture2D t2d; int num = 0; //截图计数 //public GameObject pl; //一个调试用的板子 void Start() { t2d = new Texture2D(640, 480, TextureFormat.RGB24, false); rt = new RenderTexture(640, 480, 24); mainCam.targetTexture = rt; } void Update() { //按下空格键来截图 if (Input.GetKeyDown(KeyCode.Space)) { //将目标摄像机的图像显示到一个板子上 //pl.GetComponent<Renderer>().material.mainTexture = rt; //截图到t2d中 RenderTexture.active = rt; t2d.ReadPixels(new Rect(0, 0, rt.width, rt.height), 0, 0); t2d.Apply(); RenderTexture.active = null; //将图片保存起来 byte[] byt = t2d.EncodeToJPG(); File.WriteAllBytes(Application.dataPath + "//" + num.ToString() + ".jpg", byt); Debug.Log("当前截图序号为:" + num.ToString()); num++; } }}
Texture2D( int width, int height, TextureFormat textureFormat, bool mipChain)
textureFormat:创建纹理时使用的格式。
RGB24:颜色纹理格式,每通道 8 位。每个 RGB 颜色通道均存储为 [0..1] 范围内的 8 位值。在内存中,通道数据按以下方式排序:依次为 R、G、B 字节。mipChain:该纹理是否有多级渐进纹理?
Texture2D-CreateExternalTexture - Unity 脚本 API RenderTexture (int width, int height, int depth)
depth:深度缓冲区的位数(0、16 或 24)。仅 24 位深度具有模板缓冲区。
RenderTexture-RenderTexture - Unity 脚本 API Camera.targetTexture
创建一个RenderTexture对象,在摄像机上将其设置为targetTexture。随后,摄像机就会渲染到该纹理。当 targetTexture 为“null”时,摄像机渲染到屏幕。Camera-targetTexture - Unity 脚本 API RenderTexture.active
当前处于活动状态的渲染纹理。所有渲染都将进入处于活动状态的 RenderTexture。 如果处于活动状态的 RenderTexture 为 /null/,则在主窗口中渲染所有内容。RenderTexture-active - Unity 脚本 API ReadPixels(Rect source, int destX, int destY)
source:要读取的视图的矩形区域。将从当前渲染目标读取像素。destX:纹理中的水平像素位置,用于放置读取的像素。
- destY:纹理中的垂直像素位置,用于放置读取的像素。
两个坐标都使用像素空间 - (0,0) 为左下方
Rect:由 X 和 Y 位置、宽度以及高度定义的 2D 矩形。
Texture2D-ReadPixels - Unity 脚本 API Apply ();
实际应用任何先前的SetPixel和SetPixels更改。
在贴图更改像素时并不是直接对显存进行更改,而是在另外一个内存空间中更改,这时候GPU还会实时读取旧的贴图位置。当Apply后,CPU会告诉GPU你要换个地方读贴图了。
ImageConversion.EncodeToJPG
ImageConversion:此类提供实用程序和扩展方法在 PNG、EXR、TGA 和 JPEG 格式之间进行图像数据转换。EncodeToJPG:将该纹理编码为 JPG 格式。返回的字节数组为 JPG“文件”。您可以将它们写入磁盘以获取 JPG 文件, 或通过网络发送等。
ImageConversion-EncodeToJPG - Unity 脚本 API WriteAllBytes (string path, byte[] bytes)
创建新文件,将指定字节数组写入到此文件中,然后关闭该文件。如果目标文件已经存在,它将被覆盖。
path:要写入到的文件。bytes:要写入到文件的字节。
Windows.File-WriteAllBytes - Unity 脚本 API Application.dataPath
包含目标设备上的游戏数据文件夹路径(只读)。该值取决于运行时所基于的平台。
文件路径可以用 + "//pics//" +来扩展下级文件夹Application-dataPath - Unity 脚本 API Debug.Log
将消息记录到 Unity 控制台。问题:
该代码挂到摄像机上后会摧毁相机,导致界面无法渲染,原因暂未知,但是按下空格键仍然可以完成拍照,因此目前采用两个相机相关联,一个用来观察渲染效果,一个用来挂脚本拍照 |
|