使用渲染紋理的制作攝像頭
https://www.cnblogs.com/chenliyang/p/6558455.html
使用渲染紋理的制作攝像頭
從Unity5版本開始,渲染紋理的功能對所有用戶開放(是的,包括免費版本)!你可以使用此功能來創造很酷的效果,在本文中,我將向你說明怎麽創建一個很酷的監控相機,把相機視圖投影到屏幕上。
什麽是渲染紋理呢?
渲染紋理是一種你可以在其上繪制,然後像使用其他精靈/紋理一樣的紋理。其中,最酷的一件事就是你可以使用它作為相機視圖的目標——這樣相機把它所見的繪制到紋理上(而不是顯示在屏幕上)。
另外,這裏還包含了一個可把渲染紋理保存為.PNG文件的腳本,你可以隨便使用。
在TV上顯示一個監控相機(忽略吸血鬼...)
該技術類似於一個監控相機設置。你有一個可看見圖像的相機,然後把它記錄到渲染紋理上(相當於視頻帶或硬件驅動存放圖像),最後把圖像投影到TV屏幕上。
下載
你可下載完整的Unity包(需Unity5+ 版本),或你可以跟教程做。
這個包中包括一個隨機顯示對象(和一個吸血鬼!)的demo場景。相機指向隨機的對象,並把它顯示到TV屏幕上。
吸血鬼裏有一個不錯的設計——你選擇哪個相機是否可看見(當然,鏡子或相機不能看到吸血鬼)。
在樣例場景中,你可以做如下控制:
· 箭頭按鍵——移動監控相機
· V——切換吸血鬼的可見性
· S——保存監控相機當前視圖為.PNG文件。
具體步驟
若你對Unity非常熟悉,你可以跳過本節。
對於Unity新手,這裏會包含大部分的詳細的基本操作。若你不理解或想不通,只需要打開資源包——一個非常簡單的工程——看看這些對象和他們的設置。
這個技術很大的優勢就是關鍵功能不需要一行代碼。它們都包含在了Unity的編輯器中了。
本工程有兩個腳本,但是他們是附加功能(其中一個是移動相機,另一個是保存渲染紋理為.PNG文件的)。
新建工程
新建的Unity的3D項目。
你需要的資源是兩個精靈(一個TV和一個吸血鬼)。你可以從下載文件中找到或使用你自己的。
把TV放到屏幕上,然後在其他地方隨機放置些對象(待會要用監控相機觀察這些對象)。把吸血鬼放到這些隨機對象當中。
為使TV和吸血鬼精靈導入到場景中,需要選中它們,然後把紋理類型改為精靈。
調整TV大小來使其看起來大小合適。縮放比為(4,4,1)差不多剛好。它會要把放置到場景視圖中的對象轉換為2D的。
你可以直接使用Untiy主菜單(比如:主菜單>GameObject>3D 對象>立方體)創建球型和立方體等等,或通過拖拽一些精靈到場景中來創建一些隨機項供相機查看。
大致如下圖所示,進入下一步。
場景如圖
創建吸血鬼
通過創建一個特殊層並告訴監控相機忽略此層,使吸血鬼對相機不可見。
在層次面板中選中吸血鬼,然後選擇添加圖層...在屬性面板下拉列表中添加新圖層,如下:
創建新圖層
在用戶圖層8的字段下鍵入“vampire”。
命名為‘vampire’
在吸血鬼選中的狀態下,設置它的圖層為吸血鬼:
設置圖層目前不起任何作用,但是在我們操作幾步後,它就會起作用了。
創建渲染紋理
在資源文件夾任意地方右鍵單擊,選擇創建>渲染紋理。創建一個新的渲染紋理。命名為SecurityCameraTexture。
創建一個渲染紋理
選擇SecurityCameraTexture紋理,在屬性面板中設置它大小為480x270。它的大小決定著它的分辨率,以及將要從相機視圖中保存的.PNG圖像的分辨率。
設置渲染紋理的大小
從渲染紋理創建材質
使用剛才創建的SecurityCameraTexture創建一個新的材質 :
1.
在資源文件夾任意地方右鍵單擊
2.
選擇創建>材質,命名為SecurityFootage
3.
選中新材質,修改它的著色器屬性(在屬性面板上)為手機/漫反射(Mobile/Diffuse)(你需要讓它的材質接受一個紋理,缺省是不支持的)。
4.
把SecurityCameraTexture 拖拽到材質的紋理屬性上(右上角帶有山峰照片的小盒子上):
創建新材質
至此,我們創建了一個材質,它可以把theSecurityCameraTexture 紋理顯示到任何對象表面。
監控相機
向場景中添加一個新的相機(主菜單>GameObject>相機)。
重命名新相機為SecurityCamera。
把SecurityCameraTexture 拖拽到SecrityCamera的目標紋理字段上。這就使相機視圖顯示渲染紋理而不是顯示到屏幕上,因為相機此時是作為錄像而不是把它顯示到遊戲屏幕上。
當相機被選中,你可以看到一個可看到場景窗口的小小預覽窗口。
當相機被選中時,它的視圖在預覽窗口中顯示的是場景視圖。你的場景也許與上圖不太一樣。
把相機移動到可以看到所有對象和吸血鬼的地方。你需要確保相機在你3D空間場景的前方,這樣就可以看到場景中所有對象。當可在相機預覽窗口中看到所有對象時(不包括TV屏幕),進行下個步驟。
過濾吸血鬼
在上圖預覽窗口(需要把對象顯示在TV屏幕上,待會就可以了)中,你不能看到吸血鬼。為過濾吸血鬼,在層次面板中選中SecurityCamera,然後從它的裁剪Mask中移除vampirelayer (這樣它就看不吸血鬼圖層的任何東西):
1.
在層次面板中選中SecurityCamera
2.
在屬性面板中,點擊裁剪Mask的下拉列表
3.
取消吸血鬼圖層的對勾(勾選的圖層是相機可見的)。
過濾vampire圖層的對象
若在相機預覽中吸血鬼依舊可見,回去看看,確保你對吸血鬼創建了吸血鬼圖層。
創建TV
在場景中創建一個平面(主菜單>GameObject>3D對象>平面(Plane))。重命名平面為TVScreen。
若你之前沒有用過平面,可能會覺得奇怪。因為平面是一個二維的平面,它在某些角度和視角下可能看不到。旋轉平面使其面向相機。切換3D和2D場景視圖可幫助你修改它。
修改TV Screen使其適合TV精靈的屏幕。確保它被放置到TV精靈的正前方,讓主相機看到它。
拖拽SecurityFootage 到TV Screen的材質>元素0(Element 0)的屬性(待會你需要像屏幕下方一樣擴展材質列表):
使用之前創建的SecurityFootage作為平面的材質
至此,已經把材質關聯到TV 屏幕上。你會想起之前的步驟,材質將顯示監控相機看到的。
若TV圖片上下顛倒,你需要旋轉平面到正確位置。
就是這樣!
你甚至不需要運行場景就可以看到場景對象(除了吸血鬼)顯示到TV屏幕上了。超級棒!
我們總結一下我們基本步驟:
1.
創建一個渲染紋理
2.
創建一個相機將看到的內容繪制到渲染紋理上
3.
創建一個材質來顯示渲染紋理
4.
最後,創建TV 屏幕顯示材質。
跟真的監控相機一樣,我們撲捉視圖,通過一個錄像設備(渲染紋理類似於電影的攝像機)把它發送到一個屏幕上。
提高部分
樣例工程中包含兩個額外的代碼。一個腳本是添加一些用戶控制以便移動監控相機和切換吸血鬼的顯示和隱藏;另一個腳本當按下“S”鍵時,把監控相機視圖保存為一個.PNG格式圖片文件。第二個腳本如下,並做了註釋。
保存渲染紋理
代碼是Unity問答中‘Mate-O’ 編寫,做了修改(http://answers.unity3d.com/questions/22954/how-to-save-a-picture-take-screenshot-from-a-camer.html)
代碼很簡單——讀取渲染紋理像素,編碼為.PNG ,最後保存為.PNG。註釋說明了每段代碼功能。
[csharp] view plain copy print?
- Code example:
- using UnityEngine;
- using System.Collections;
- using System;
- public class CameraSnapshot : MonoBehaviour
- {
- [SerializeField]
- RenderTexture securityCameraTexture; // drag the render texture onto this field in the Inspector
- [SerializeField]
- Camera securityCamera; // drag the security camera onto this field in the inspector
- void LateUpdate()
- {
- if (Input.GetKeyDown("s"))
- {
- StartCoroutine(SaveCameraView());
- }
- }
- public IEnumerator SaveCameraView()
- {
- yield return new WaitForEndOfFrame();
- // get the camera‘s render texture
- RenderTexture rendText= RenderTexture.active;
- RenderTexture.active = securityCamera.targetTexture;
- // render the texture
- securityCamera.Render();
- // create a new Texture2D with the camera‘s texture, using its height and width
- Texture2D cameraImage= new Texture2D(securityCamera.targetTexture.width, securityCamera.targetTexture.height, TextureFormat.RGB24, false);
- cameraImage.ReadPixels(new Rect(0, 0, securityCamera.targetTexture.width, securityCamera.targetTexture.height), 0, 0);
- cameraImage.Apply();
- RenderTexture.active = rendText;
- // store the texture into a .PNG file
- byte[] bytes = cameraImage.EncodeToPNG();
- // save the encoded image to a file
- System.IO.File.WriteAllBytes(Application.persistentDataPath + "/camera_image.png", bytes);
- }
- }
一旦腳本添加到場景中,就可以按下“S”鍵來獲取相機截圖。你可以訪問保存的文件。
總結
渲染紋理是一個你可以繪制的畫布。通過關聯渲染紋理到相機的輸出,就可以把相機所見繪制到渲染紋理上。
因為渲染紋理是一個紋理,就可以把它關聯到材質上。然後,添加材質到對象上並有效的把渲染紋理投影到對象的表面。
監控顯示是對它工作原理是一個很好的比喻。相機就是相機,渲染紋理是視頻錄制,材質是你視頻投影到的屏幕。
展望?
現在,你應該理解了渲染紋理的工作原理,並可靈活使用。.PNG輸出也提供了很多可能。渲染紋理特性(還有其他屬性)對Unity5之前的非專業版本用戶不開放,越來越開放使Unity成為越來越棒的工具。
使用該技術的一些想法:
· 使用多個精靈形成一個新的圖片保存為.PNG,在遊戲中使用(比如:通過不同的特征組成一張臉)。
· 紅外相機可以看到裸眼不可見生物。
· 若你可以找到一個方法修改相機輸出(比如:讓TV屏幕為黑白屏或像老電腦屏幕一樣泛綠光)。
使用渲染紋理的制作攝像頭