ChuanXin 发表于 2022-4-24 18:19

2022-04-23 unity3D虚拟相机拍照-学习记录

创建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 颜色通道均存储为 范围内的 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 控制台。

Debug-Log - Unity 脚本 API

问题:
该代码挂到摄像机上后会摧毁相机,导致界面无法渲染,原因暂未知,但是按下空格键仍然可以完成拍照,因此目前采用两个相机相关联,一个用来观察渲染效果,一个用来挂脚本拍照
页: [1]
查看完整版本: 2022-04-23 unity3D虚拟相机拍照-学习记录