Unity3D 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 }
时间: 2024-12-17 17:25:40

Unity3D Camera RenderToCubemap 渲染到立方体纹理的相关文章

OpenGL学习脚印:立方体纹理和天空包围盒(Cubemaps And Skybox)

写在前面 之前学习了2D纹理映射,实际上还有其他类型的纹理有待我们进一步学习,本节将要学习的立方体纹理(cubemaps),是一种将多个纹理图片复合到一个立方体表面的技术.在游戏中应用得较多的天空包围盒可以使用cubemap实现.本节示例程序均可以在我的github下载. 本节内容整理自: 1.Tutorial 25:SkyBox 2.www.learnopengl.com Cubemaps 创建Cubemap cubemap是使用6张2D纹理绑定到GL_TEXTURE_CUBE_MAP目标而创

Unity3d三大光照渲染介绍

重要:在目前市面上常见的游戏引擎中,主要采用以下三种灯光实现方式: 顶点照明渲染路径细节 Vertex Lit Rendering Path Details 正向渲染路径细节 Forward Rendering Path Details 延迟光照渲染路径的细节 Deferred Lighting Rendering Path Details 以unity3d为例,以下将详细讲解三种灯光渲染方式的实现.原理及缺陷. 顶点照明渲染路径细节 Vertex Lit Rendering Path Deta

Unity3d Camera

简单总结下:  先上图 假设现在有三个摄像机.我们的视野为 1*1 的正方形. 也就说如果我们需要在一个屏幕内需要同时显示三个摄像机的视野,需要瓜分我们的1*1的屏幕.  如图每个摄像机的坐标都取左下的定点.即可完成分屏.   在赛车游戏中会用到小窗口. 这个时候 也是按照左边去分1*1的屏幕. 需要注意的是 小窗口的Depth必须大于大窗口的Depth.关于天空盒子,设置方法如下 在camera中设置天空盒子,值得注意的是每一个camera都有自己的天空盒子 在窗体Render中选择渲染天空盒

WorldWind源码剖析系列:WorldWind实时确定、更新、初始化和渲染地形和纹理数据

WorldWind实时确定.更新.初始化和渲染地形和纹理数据 当用户点击WorldWind中的地球时,首先响应的是WorldWindow.OnPaint()函数,后续程序的调用流程如下图所示. 零散知识点: 1.         地形瓦片类TerrainTile引用了地形瓦片服务类TerrainTileService,在TerrainTile的Initialize()函数中实例化并发起了地形下载请求类TerrainDownloadRequest对象.而在TerrainTileService类中也

Unity3d 基于物理渲染Physically-Based Rendering之最终篇

前情提要: 讲求基本算法 Unity3d 基于物理渲染Physically-Based Rendering之specular BRDF plus篇 Unity3d 基于物理渲染Physically-Based Rendering之实现 最后我们用fragment shader 实现,加上diffuse漫反射,代码和之前的surface差不多,只是多了reflect方向的计算,reflect方向的计算方法为用CG函数库中函数reflect, float3 reflect(float3 i, flo

unity3d 安卓播放视频替代视频纹理

导出apk,是不能用电影纹理的,所以我们只能用这个办法 这个 Handheld.PlayFullScreenMovie(); 或者这个函数            iPhoneUtils.PlayMovie(); void OnGUI() { if (GUI.Button(new Rect(Screen.width / 2 - 10, Screen.height / 2 - 10, 100,20), "(h)CancelOnTouch")) { Handheld.PlayFullScre

Unity3d的批渲染 batch rendering

批渲染(Batch) batch render 是大部分引擎提高渲染效率的方法,基本原理就是通过将一些渲染状态一致的物体合成一个大物体,一次提交给gpu进行绘制,如果不batch的话,就要提交给很多次,这可以显著的节省drawcall,实际上这主要节省了cpu的时间,cpu从提交多次到提交一次,对gpu来说也不用多次切换渲染状态.当然能batch的前提一定是渲染状态一致的一组物体. Unity3d的批渲染分为两种,动态和静态 静态批 要求:必须使用同一张material,然后在编辑器里设置为st

unity3d 基于物理渲染的问题解决

[狗刨学习网] 最近1个月做了unity 次世代开发的一些程序方面的支持工作,当然也是基于物理渲染相关的,主要还是skyshop marmoset的使用吧,他算是unity4.x版本 PBR的优秀方案之一了 但在使用以及性能上,还是多少有些坑和不足,这里也是自己的一些心得吧,希望可以其他对这个方案有兴趣的朋友起到一些帮助. 一.遇到了fps降低的BUG 国庆节前的老版本工程和最新的工程版本运行起来没任何区别,但新版本在真机上的的运行效率有问题,只有7.5fps 开发和运行环境, XCode6.1

unity3d camera size

在2d摄像机中,有一个camera size的属性,之前一直不知道怎么用,今天查了一些资料,在此记录下. 2d camera 中的 size用于分辨率适应.比如我想要在1080 * 720的手机上以1:1的像素(photoshop中的图和显示的图的像素比例)显示我的贴图,我就需要去调整size的大小. unity3d的sprite属性默认为 100 pixel pre unit ,即1个unit单位占据100个像素,我们高度需要720个像素,即7.2个unit单位,size记录的是摄像机视口中心