版本: Unity 6 (6000.0)
语言英语
  • C#

Camera.RenderToCubemap

建议更改

成功!

感谢您帮助我们提高 Unity 文档的质量。虽然我们无法接受所有提交内容,但我们会阅读用户提出的每一个建议,并在适当情况下进行更新。

关闭

提交失败

由于某些原因,您的建议更改无法提交。请<a>稍后再试</a>。感谢您抽出时间帮助我们提高 Unity 文档的质量。

关闭

取消

切换到手册

声明

public bool RenderToCubemap(Cubemap cubemap, int faceMask);

参数

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

返回值

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

描述

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

此函数在编辑器中主要用于为您的场景“烘焙”静态立方体贴图。请参阅下面的向导示例。如果您想要实时更新的立方体贴图,请使用 RenderToCubemap 变体,该变体使用具有立方体贴图维度的 RenderTexture,请参阅以下内容。

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

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

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

其他资源:立方体贴图资产反射着色器

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. // Real-time 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 会渲染场景的单眼视图。在渲染单独的左眼和右眼立方体贴图后,您可以将它们转换为占用一个纹理的等矩形全景图像。

渲染立体视图的任一侧时,摄像机使用其 stereoSeparation 值作为瞳距 (IPD),除非启用了 VR 支持。使用 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); } } }