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!"); } }
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); } }
cubemap | 要渲染到的纹理。 |
faceMask | 一个位字段,指示应渲染到哪些立方体贴图面。设置为整数值 63 以渲染所有面。 |
stereoEye | 与立体渲染的左眼或右眼对应的摄像机眼,或者对于非立体渲染则不对应任何眼。 |
bool 如果渲染失败则为 false,否则为 true。
从该摄像机将立体 360 度图像的一侧渲染到立方体贴图。
将 stereoEye
参数设置为 Camera.MonoOrStereoscopicEye.Left 或 Camera.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); } } }