Version: 2020.3

Camera.RenderToCubemap

切换到手册
public bool RenderToCubemap (Cubemap cubemap, int faceMask);

参数

cubemap 要渲染到的立方体贴图。
faceMask 位掩码,用于确定渲染到六个面中的哪一个。

返回

bool 如果渲染失败,返回 false,否则返回 true。

描述

从该摄像机渲染到一个静态立方体贴图。

该函数的主要用途是在编辑器中“烘焙”场景的静态立方体贴图。请参阅 下面的向导示例。如果需要实时更新的立方体贴图,请使用 RenderToCubemap 变体, 该变体使用一个具有立方体贴图尺寸的 RenderTexture,详见下文。

将使用摄像机的位置、清除标记和裁剪面距离渲染到立方体贴图面。 faceMask 是一个位域,指示应渲染到立方体贴图的哪些面。设置的每个位 对应一个面。位数为 CubemapFace 枚举的整数值。 默认情况下,将渲染立方体贴图的所有六个面(默认值为 63 - 即最低六位均被置位)。

如果渲染到立方体贴图失败,该函数将返回 /false/。某些图形硬件不支持 该功能。

另请注意,ReflectionProbes 是执行实时反射的更高级的方法。通过选择 Create > Legacy 选项,可以在 Editor 中创建立方体贴图。

另请参阅:立方体贴图资源反光着色器

using UnityEngine;
using UnityEditor;
using System.Collections;

public class RenderCubemapWizard : ScriptableWizard { public Transform renderFromPosition; public Cubemap cubemap;

void OnWizardUpdate() { string helpString = "Select transform to render from and cubemap to render into"; bool isValid = (renderFromPosition != null) && (cubemap != null); }

void OnWizardCreate() { // create temporary camera for rendering GameObject go = new GameObject("CubemapCamera"); go.AddComponent<Camera>(); // place it on the object go.transform.position = renderFromPosition.position; go.transform.rotation = Quaternion.identity; // render into cubemap go.GetComponent<Camera>().RenderToCubemap(cubemap);

// destroy temporary camera DestroyImmediate(go); }

[MenuItem("GameObject/Render into Cubemap")] static void RenderCubemap() { ScriptableWizard.DisplayWizard<RenderCubemapWizard>( "Render cubemap", "Render!"); } }

public bool RenderToCubemap (RenderTexture cubemap, int faceMask);

参数

faceMask 位域,指示应渲染到立方体贴图的哪些面。
cubemap 要渲染到的纹理。

返回

bool 如果渲染失败,返回 false,否则返回 true。

描述

从该摄像机渲染到一个立方体贴图。

用于将实时反光渲染到立方体贴图渲染纹理。该操作开销很大, 如果每帧都需要渲染立方体贴图的所有六个面,代价将极其高昂。

将使用摄像机的位置、清除标记和裁剪面距离渲染到立方体贴图面。 faceMask 是一个位域,指示应渲染到立方体贴图的哪些面。设置的每个位 对应一个面。位数为 CubemapFace 枚举的整数值。 默认情况下,将渲染立方体贴图的所有六个面(默认值为 63 - 即最低六位均被置位)。

如果渲染到立方体贴图失败,该函数将返回 /false/。某些图形硬件不支持 该功能。

注意,必须将 RenderTexture 的 RenderTexture.dimension 设置为 TextureDimension.Cube。下面的示例将对此进行说明。

另请参阅:RenderTexture.isCubemap、反光着色器

using UnityEngine;

[ExecuteInEditMode] public class Example : MonoBehaviour { // Attach this script to an object that uses a Reflective shader. // Realtime reflective cubemaps!

int cubemapSize = 128; bool oneFacePerFrame = false; Camera cam; RenderTexture renderTexture;

void Start() { // render all six faces at startup UpdateCubemap(63); }

void OnDisable() { DestroyImmediate(cam); DestroyImmediate(renderTexture); }

void LateUpdate() { if (oneFacePerFrame) { var faceToRender = Time.frameCount % 6; var faceMask = 1 << faceToRender; UpdateCubemap(faceMask); } else { UpdateCubemap(63); // all six faces } }

void UpdateCubemap(int faceMask) { if (!cam) { GameObject obj = new GameObject("CubemapCamera", typeof(Camera)); obj.hideFlags = HideFlags.HideAndDontSave; obj.transform.position = transform.position; obj.transform.rotation = Quaternion.identity; cam = obj.GetComponent<Camera>(); cam.farClipPlane = 100; // don't render very far into cubemap cam.enabled = false; }

if (!renderTexture) { renderTexture = new RenderTexture(cubemapSize, cubemapSize, 16); renderTexture.dimension = UnityEngine.Rendering.TextureDimension.Cube; renderTexture.hideFlags = HideFlags.HideAndDontSave; GetComponent<Renderer>().sharedMaterial.SetTexture("_Cube", renderTexture); }

cam.transform.position = transform.position; cam.RenderToCubemap(renderTexture, faceMask); } }

public bool RenderToCubemap (RenderTexture cubemap, int faceMask, Camera.MonoOrStereoscopicEye stereoEye);

参数

cubemap 要渲染到的纹理。
faceMask 位域,指示应渲染到立方体贴图的哪些面。设置为整数值 63 将渲染所有面。
stereoEye 摄像机眼,对应于左眼或右眼(用于立体渲染),或不对应于眼睛(用于非立体渲染)。

返回

bool 如果渲染失败,返回 false,否则返回 true。

描述

从该摄像机将一个 360 度立体图像的一侧渲染到一个立方体贴图。

stereoEye 参数设置为 Camera.MonoOrStereoscopicEye.LeftCamera.MonoOrStereoscopicEye.Right 后将以适当的世界空间变换来渲染 360 度立体图像的左眼或右眼视角。将 stereoEye 设置为 Camera.MonoOrStereoscopicEye.Mono 可渲染场景的单视场视图。渲染单独的左右立方体贴图之后,可以将其转换成占用一个纹理的等距圆柱投影全景图像。

在渲染立体视图的任一侧时,除非启用了 VR 支持,否则摄像机将使用其 stereoSeparation 值作为瞳孔间距 (IPD)。使用 VR 摄像机时,VR 设备 IPD 会重写 stereoSeparation 值。

Unity 使用摄像机的位置、清除标志和裁剪面距离来 渲染到立方体贴图面。每个面都要旋转摄像机。faceMask 是一个位域,指示应渲染到立方体贴图的哪些面。设置 的每个位对应于一个面。位数为 CubemapFace 枚举的整数值。 要捕获 360 度立体图像,应渲染立方体贴图的所有六个面(将 facemask 设置为 63)。

如果渲染到立方体贴图失败,该函数将返回 /false/。某些图形硬件不 支持该功能。

注意,必须将 RenderTexture 的 RenderTexture.dimension 设置为 TextureDimension.Cube

另请参阅:RenderTexture.isCubemap、立方体贴图

using UnityEngine;
using UnityEngine.Rendering;

//attach this script to your camera object public class CreateStereoCubemaps : MonoBehaviour { public RenderTexture cubemapLeftEye; public RenderTexture cubemapRightEye; public RenderTexture equirect; public bool renderStereo = true; public float stereoSeparation = 0.064f;

void Start() { cubemapLeftEye = new RenderTexture(1024, 1024, 24, RenderTextureFormat.ARGB32); cubemapLeftEye.dimension = TextureDimension.Cube; cubemapRightEye = new RenderTexture(1024, 1024, 24, RenderTextureFormat.ARGB32); cubemapRightEye.dimension = TextureDimension.Cube; //equirect height should be twice the height of cubemap equirect = new RenderTexture(1024, 2048, 24, RenderTextureFormat.ARGB32); }

void LateUpdate() { Camera cam = GetComponent<Camera>();

if (cam == null) { cam = GetComponentInParent<Camera>(); }

if (cam == null) { Debug.Log("stereo 360 capture node has no camera or parent camera"); }

if (renderStereo) { cam.stereoSeparation = stereoSeparation; cam.RenderToCubemap(cubemapLeftEye, 63, Camera.MonoOrStereoscopicEye.Left); cam.RenderToCubemap(cubemapRightEye, 63, Camera.MonoOrStereoscopicEye.Right); } else { cam.RenderToCubemap(cubemapLeftEye, 63, Camera.MonoOrStereoscopicEye.Mono); }

//optional: convert cubemaps to equirect

if (equirect == null) return;

if (renderStereo) { cubemapLeftEye.ConvertToEquirect(equirect, Camera.MonoOrStereoscopicEye.Left); cubemapRightEye.ConvertToEquirect(equirect, Camera.MonoOrStereoscopicEye.Right); } else { cubemapLeftEye.ConvertToEquirect(equirect, Camera.MonoOrStereoscopicEye.Mono); } } }