1 前言

在Unity中要得到某些3D游戏对象的截图,是比较容易的,本文来讨论一下。

实现的核心方案,是新建一个Camera,Camera指向目标对象。Camera有个参数是TargetTexture,叫目标渲染纹理,提取该纹理的像素,生成图片

来看一下Camera的属性:

一般情况下,摄像机直接渲染到屏幕,即,当 targetTexture 为 null 时,摄像机渲染到屏幕。但如果创建一个 RenderTexture 对象, 在摄像机上将其设置为 targetTexture,则摄像机就会渲染到 该纹理。当渲染到纹理时,摄像机始终渲染到整个纹理中。 这有一种离屏渲染FBO的味道了^^

再补充一下RenderTexture的知识。RenderTexture即,渲染纹理,是指可对其进行动态渲染的纹理。

它们可用于实现基于图像的渲染特效、动态阴影、 投影器、反射或监视摄像机。
渲染纹理的一个典型用法是将其设置为 摄像机的“目标纹理”属性 (Camera.targetTexture),这将使摄像机渲染到纹理, 而不是渲染到屏幕。

2 具体实现

背景:有如下一个简单的3D世界,包括一个Cube正方体,一个Plane 绿色平板,一个Plane白色平板。
目标:把Cube和绿色平板一起截取下来。

2.1 新建离屏渲染Camera

新建一个Camera,视锥Projection设置为正交投影Orthographic,位置放在3D对象的后方,使其可以照射到目标游戏对象,具体如下:

选中Camera对象,会有个小窗口,如图中的箭头,可以看到Camera所得到的实际视图,方便你的调试位置,大小。

如果要调整Camera的视锥范围,可以修改参数中的Size

接下来,就可以写代码,去截图了。

2.2 代码实现

具体如下:

using Assets.Scripts;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Get3DImage : MonoBehaviour
{private RenderTexture shortcutRenderTexture;private Camera cutImageCamera;// Start is called before the first frame updatevoid Start(){cutImageCamera = GameObject.Find("CutImageCamera").GetComponent<Camera>();init();}// Update is called once per framevoid Update(){}private void init(){shortcutRenderTexture = RenderTexture.GetTemporary(600, 600, 16, RenderTextureFormat.Default, RenderTextureReadWrite.Linear);shortcutRenderTexture.enableRandomWrite = true;cutImageCamera.targetTexture = shortcutRenderTexture;}public void StartCutImage(){// Create a new Texture2D and read the RenderTexture image into itRenderTexture.active = shortcutRenderTexture;Texture2D drawTexture2D = new Texture2D(shortcutRenderTexture.width, shortcutRenderTexture.height, TextureFormat.RGB24, false);drawTexture2D.ReadPixels(new Rect(0, 0, shortcutRenderTexture.width, shortcutRenderTexture.height), 0, 0);drawTexture2D.Apply();TextureUtils.saveTextureToFile(drawTexture2D, "SaveShortcut");}private void OnDestroy(){RenderTexture.ReleaseTemporary(shortcutRenderTexture);}
}

核心代码

RenderTexture.active = shortcutRenderTexture;

上面的核心代码,表示设置当前的激活态的RenderTexture为 Camera所指向的RenderTexture(同样游戏场景中可能有多个RenderTexture)。此时可以新建一个Texture2D,调用ReadPixels,即会读取激活态的RenderTexture的内容。

接下来就简单了,把Texture2D保存即可。代码如下:

using System.IO;
using UnityEngine;namespace Assets.Scripts
{class TextureUtils{public static Texture2D DeCompress(Texture2D source){RenderTexture renderTex = RenderTexture.GetTemporary(source.width,source.height,0,RenderTextureFormat.Default,RenderTextureReadWrite.Linear);Graphics.Blit(source, renderTex);RenderTexture previous = RenderTexture.active;RenderTexture.active = renderTex;Texture2D readableText = new Texture2D(source.width, source.height);readableText.ReadPixels(new Rect(0, 0, renderTex.width, renderTex.height), 0, 0);readableText.Apply();RenderTexture.active = previous;RenderTexture.ReleaseTemporary(renderTex);return readableText;}public static string saveTextureToFile(Texture2D texture, string fileName){if (texture == null){return "";}byte[] bytes = TextureUtils.DeCompress(texture).EncodeToPNG();string filename = Application.persistentDataPath + "/" + fileName + ".png";Debug.Log("DrawManager::saveTextureToFile = " + filename);File.WriteAllBytes(filename, bytes);return filename;}}
}

3 用RenderTexture实现画中画

本文使用到了RenderTexture,且是代码动态创建的。我们也可以在菜单中创建,甚至还可以做一个画中画PIP的功能,比较有意思,顺着思路,我们来聊一下画中画的实现。

3.1 建RenderTexture

在Assets目录下,右键,Create – RenderTexture,新建一个渲染纹理。
然后,把Size参数设置为和屏幕宽高一样,例如1920x1080.

3.2 建材质

接着,右键,Create – Material,新建一个材质。Shader选为Unlit/Texture。然后,如下右边箭头,把材质所使用的纹理,选择为上面新建的RenderTexture。

有了材质,就可以用在游戏场景中了!

3.3 建Image作为PIP窗口

新建一个2D Image,然后把Image的材质,设置为3.2所建的材质。

好了,运行起来,效果如下:

最后,上代码:
TestGet3DImage

Unity 截取3D图像 与 画中画PIP的实现相关推荐

  1. 【手把手教你】搭建神经网络(CT扫描3D图像的分类)

    大家好,我是羽峰,今天要和大家分享的是一个基于tensorflow的CT扫描3D图像的分类.文章会把整个代码进行分割讲解,完整看完,相信你一定会有所收获. 欢迎关注"羽峰码字" 目 ...

  2. html 3d立体阴影效果图,CSS3打造带阴影的旋转3D图像

    CSS3打造带阴影的旋转3D图像 Sponsor CSS3可以实现很多创新好玩的交互效果,正如今天将和大家介绍的3D旋转图像,效果很漂亮,这个旋转图像的特别之处就是支持阴影旋转和兼容响应式网页设计,使 ...

  3. 听声辨位过时了!这个AI系统仅凭光回声就能得到3D图像

    机器之心报道 编辑:魔王.蛋酱 借助光回声获得时间信息,利用机器学习从看似噪声的信息中挖掘模式.这项研究登上光学期刊 Optica.‍ 利用光回声和机器学习制作 3D 影像(左),右图来自 3D 相机 ...

  4. 《Unity 4 3D开发实战详解》一6.7 物理引擎综合案例

    本节书摘来异步社区<Unity 4 3D开发实战详解>一书中的第6章,第6.7节,作者: 吴亚峰 , 杜化美 , 张月霞 , 索依娜 责编: 张涛,更多章节内容可以访问云栖社区" ...

  5. 虚拟在左,真实在右:德国学者用AI合成一亿像素逼真3D图像,可任意旋转

    来源:AI科技评论 编译:杏花 编辑:青暮 近日,来自德国埃尔兰根-纽伦堡大学的学者提出了一种新颖的神经网络方法,用于3D图像的场景细化和新视图合成. 只需要输入点云和相机参数的初始估计,就可以输出由 ...

  6. 在WPF中将图片转换成3D图像并可以旋转

    原文:在WPF中将图片转换成3D图像并可以旋转 时光偷走的,永远都是我们眼皮底下看不见的珍贵. https://pan.baidu.com/s/14dk-OU2SR0nxXj2bL4bVpQ 首先先看 ...

  7. python绘制可多角度查看的3d图像

    用鼠标拖动可多角度查看3d图像. # Enable interactive rotation of graph %matplotlib notebookimport numpy as np impor ...

  8. 正确的「记事本」打开方式:能渲染3D图像,还能玩贪吃蛇

    金磊 发自 凹非寺 量子位 报道 | 公众号 QbitAI 渲染3D图像,一个「记事本」就够了. 最近,GitHub上一名叫"Kyle Halladay"的小哥,便上传了这样一个项 ...

  9. MPO文件类型解码(四)3D图像整体结构

    MP文件的数据结构 每一个MP文件包含两个或多个图片(所示的Individual Images)所谓MP就是多角度视图的意思. 1.MPO文件整体结构如图1 从整体结构图可以看出MPO文件类型的3D图 ...

最新文章

  1. 软件构架实践读书笔记二
  2. HDU (1575)Tr A ---矩阵快速幂
  3. shell特殊符号cut命令、sort_wc_uniq命令、tee_tr_split命令、shell特殊符号下
  4. win10共享打印机怎么设置_小编为你叙述 win10系统网络共享理光打印机的设置方法的技巧介绍 -win10使用教程...
  5. Markdown简单语法总结
  6. JavaFX 2 GameTutorial第4部分
  7. 领域驱动设计和开发实战总结
  8. Bootstrap 带下拉的导航
  9. 递归法:求n个元素的全排列
  10. Docker 开篇 1 | 树莓派中搭建Docker
  11. php打印上传错误信息,PHP上传文件错误信息说明
  12. java毕业设计HTML5旅游网站源码+系统+数据库+lw文档+调试运行
  13. 安装CAD2006出现html,win7系统安装cad2006出现已终止CAD2006-Simplifieng安装的解决方法...
  14. [Python] 网络设备巡检脚本
  15. 计算机读不出来u盘装系统,重装系统后电脑u盘读不出来
  16. Java核心技术 学习记录1
  17. python皮卡丘字符打印代码_皮卡丘第二种
  18. php.ini afm,nanoscope analysis(AFM数据处理软件) v1.5 官方安装免费版(附安装教程)
  19. 集线器,转发器,网桥,以太网交换机
  20. 爬取全民K歌用户歌曲

热门文章

  1. 免费好用的录屏软件OBS-Studio
  2. 软件测试实习生(月薪3k-5k)需要具备哪些技能才能找到工作?
  3. ubuntu 16.04.4 desktop版安装
  4. 计算机专业 中职学校顶岗实习学校总结,中职学校顶岗实习论文(2)
  5. mac Matlab 运行一段时间后 崩溃 Matlab遇到一个内部错误,需要关闭
  6. 辅导班师资力量介绍!
  7. ValueError: cannot reshape array of size xxx into shape (xxx,xxx,xxx)解决方法
  8. 数十亿红包,正谋杀我们的春节
  9. FPGA数字时钟(可暂停调数,含代码)
  10. 推荐一个多端的开发框架uni-app