【Unity渲染】Camera RenderToCubemap 渲染到立方體紋理


Unity聖典 傳送門:http://www.ceeger.com/Script/Camera/Camera.RenderToCubemap.html

Camera.RenderToCubemap 有4個重載

(1)bool  RenderToCubemap(Cubemap cubemap)

    bool  RenderToCubemap(Cubemap cubemap,int faceMask)

  可以用於在編輯器中生成場景靜態立方體貼圖。faceMask是一個bitfield比特數,表示那個立方貼圖面應該被渲染,每個位對

應於一個面。比特數是Cubemapface枚舉的整型值。默認的所有六個立方貼圖面都被渲染(默認值63的低6位是打開的)。

 1 // Render scene from a given point into a static cube map.
 2 //從給定的點渲染場景到以靜態立方貼圖
 3 // Place this script in Editor folder of your project.
 4 //放置這個腳本到工程的Editor文件夾中
 5 // Then use the cubemap with one of Reflective shaders!
 6 //然后用一個Reflective shaders 來使用這個立方貼圖
 7 class RenderCubemapWizard extends ScriptableWizard {
 8     var renderFromPosition : Transform;
 9     var cubemap : Cubemap;
10 
11     function OnWizardUpdate () {
12         helpString = "Select transform to render from and cubemap to render into";
13         isValid = (renderFromPosition != null) && (cubemap != null);
14     }
15 
16     function OnWizardCreate () {
17         // create temporary camera for rendering
18         //為渲染創建臨時相機
19         var go = new GameObject( "CubemapCamera", Camera );
20         // place it on the object
21         //放置它到物體上
22         go.transform.position = renderFromPosition.position;
23         go.transform.rotation = Quaternion.identity;
24 
25         // render into cubemap
26         //渲染到立方貼圖    
27         go.camera.RenderToCubemap( cubemap );
28 
29         // destroy temporary camera
30         //銷毀臨時相機
31         DestroyImmediate( go );
32     }
33 
34     @MenuItem("GameObject/Render into Cubemap")
35     static function RenderCubemap () {
36         ScriptableWizard.DisplayWizard.<RenderCubemapWizard>(
37         "Render cubemap", "Render!");
38     }
39 }

(2)bool  RenderToCubemap(RenderTexture cubemap)

         bool  RenderToCubemap(RenderTexture cubemap,int faceMask)

        這個用於實時反射到立方貼圖渲染紋理。這是非常耗時的,尤其是所有六個立方貼圖面在每一幀中都被渲染。

如果渲染失敗這個函數將返回false,某些顯卡不支持這個函數。

  同時,一定要將 RenderTexture.isCubemap = true

 1 using UnityEngine;
 2 using System.Collections;
 3 using UnityEngine.UI;
 4 using UnityEditor;
 5 
 6 // Attach this script to an object that uses a Reflective shader.
 7 // Realtime reflective cubemaps!
 8 //附加這個腳本到使用了Reflective shader的物體上 
 9 //實時反射立方貼圖
10 [ExecuteInEditMode]
11 public class RealtimeCubemap :MonoBehaviour
12 {
13     int cubemapSize = 128;
14     //一幀渲染一面
15     bool oneFacePerFrame = false; 
16     Camera cam = null;
17     RenderTexture cubemap = null;
18     Material mat = null;
19 
20     void Start()
21     {
22         //在啟動時渲染所有六個面
23         UpdateCubemap(63);
24     }
25 
26     void LateUpdate()
27     {
28         if (oneFacePerFrame)
29         {
30             int faceToRender = Time.frameCount % 6;
31             int faceMask = 1 << faceToRender;
32             UpdateCubemap(faceMask);
33         }
34         else
35         {
36             //所有六個面
37             UpdateCubemap(63);
38         }
39     }
40 
41     
42 void UpdateCubemap (int faceMask )
43 {
44     if (cam == null)
45     {
46         GameObject go = new GameObject("CubemapCamera", typeof(Camera));
47 
48         //隱藏在場景中
49         go.hideFlags = HideFlags.HideAndDontSave;
50         go.transform.position = transform.position;
51         go.transform.rotation = Quaternion.identity;
52         cam = go.GetComponent<Camera>();
53 
54         ///不要渲染較遠的部分
55         cam.farClipPlane = 100;
56         cam.enabled = false;
57     }
58     if (mat == null)
59     {
60         mat = new Material(Shader.Find("Custom/RealtimeCubemap"));
61         mat.hideFlags = HideFlags.HideAndDontSave;
62         GetComponent<Renderer>().material = mat;
63     }
64 
65     if (cubemap == null)
66     {
67         cubemap = new RenderTexture(cubemapSize, cubemapSize, 16);
68         cubemap.isPowerOfTwo = true;
69         cubemap.isCubemap = true;
70         cubemap.hideFlags = HideFlags.HideAndDontSave;
71         mat.SetTexture("_Cubemap", cubemap);
72     }
73 
74     cam.transform.position = transform.position;
75     cam.RenderToCubemap(cubemap, faceMask);
76 }
77 
78     void OnDisable()
79     {
80         DestroyImmediate(cam);
81         DestroyImmediate(cubemap);
82     }
83 
84 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM