找回密码
 立即注册
查看: 356|回复: 0

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

[复制链接]
发表于 2022-4-24 18:19 | 显示全部楼层 |阅读模式
创建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 控制台。
Debug-Log - Unity 脚本 API
问题:
该代码挂到摄像机上后会摧毁相机,导致界面无法渲染,原因暂未知,但是按下空格键仍然可以完成拍照,因此目前采用两个相机相关联,一个用来观察渲染效果,一个用来挂脚本拍照
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-9-22 13:35 , Processed in 0.090005 second(s), 25 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表