Camera.RenderToCubemap
Declaration
public bool RenderToCubemap(Cubemap cubemap);public bool RenderToCubemap(Cubemap cubemap, int faceMask);Параметры
| Параметр | Описание |
|---|---|
| кубическая | Кубическое сопоставление для отображения. |
| faceMask | Битовая маска, определяющая, на какую из шести граней будет выполняться отображение. Если не указано, то для отображения на все грани куба маска устанавливается на значение 63. |
Возвращаемое значение
логическое False, если отображение не удалось, в противном случае true.
Описание
Отрисовывать с этой камеры в статическую кубическую карту.
Эта функция полезна главным образом в редакторе для «запекания» статических кубических карт вашей сцены. См. пример мастера ниже. Если нужна кубическая карта, обновляемая в реальном времени, используйте вариант RenderToCubemap с RenderTexture, имеющей размерность кубической карты (см. ниже).
Положение Camera, флаг очистки и расстояние до плоскости обрезки будут использованы для рендеринга в лица кубической карты. faceMask является битовым полем, указывающим, в какие грани кубического отображения должны быть отображены. Каждый установленный бит соответствует грани. Число бит — это целое число, CubemapFace перечисление. По умолчанию отрисовываются все шесть граней кубической карты (у значения по умолчанию 63 установлены шесть младших битов).
Эта функция возвратит false если рендеринг в cubemap не удаётся. Некоторые графические аппаратные средства не поддерживают функциональность.
Обратите также внимание, что ReflectionProbes являются более продвинутым способом выполнения отражений в реальном времени. Кубические карты можно создать в редакторе, выбрав Create->Legacy.
Дополнительные ресурсы: Ассеты Cubemap, Отражающие шейдеры.
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!"); } }
Declaration
public bool RenderToCubemap(RenderTexture cubemap);public bool RenderToCubemap(RenderTexture cubemap, int faceMask);Параметры
| Параметр | Описание |
|---|---|
| faceMask | Битовая маска, указывающая, в какие грани кубического сопоставления должны быть отображены. Если не указано, маска устанавливается на значение 63, чтобы отображать все грани кубического сопоставления. |
| кубическая | Текстура для рендеринга. |
Возвращаемое значение
логическое False, если отображение не удалось, в противном случае true.
Описание
Рендирование в кубическую карту с этой камеры.
Это используется для отражения в реальном времени в текстуры рендеринга кубических карт. Это может быть довольно дорого, особенно если все шесть поверхностей кубических карт рендируются в каждом кадре.
Положение Camera, флаги очистки и расстояние до плоскости обрезки будут использованы для рендеринга в лица кубической карты. faceMask является битовым полем, указывающим, в какие грани кубического отображения должны быть отображены. Каждый установленный бит соответствует грани. Число бит — это целое число, CubemapFace перечисление. По умолчанию отрисовываются все шесть граней кубической карты (у значения по умолчанию 63 установлены шесть младших битов).
Эта функция возвратит false если рендеринг в cubemap не удаётся. Некоторые графические аппаратные средства не поддерживают функциональность.
Обратите внимание, что 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); } }
Declaration
public bool RenderToCubemap(RenderTexture cubemap, int faceMask, Camera.MonoOrStereoscopicEye stereoEye);Параметры
| Параметр | Описание |
|---|---|
| кубическая | Текстура для рендеринга. |
| faceMask | Битовое поле, указывающее, в какие грани кубического отображения должны быть отображены. Установите целое число 63 для отображения всех граней. |
| stereoEye | глаз Camera, соответствующий левой или правой части глаза в случае стереоскопического отображения, или не соответствующий ни одной из этих частей в случае нестереоскопического отображения. |
Возвращаемое значение
логическое False, если отображение не удалось, в противном случае true.
Описание
Рендирование одной стороны стереоскопического 360-градусного изображения в кубическую карту с этой камеры.
Установка stereoEye параметр к Camera.MonoOrStereoscopicEye.Left или Camera.MonoOrStereoscopicEye.Right отображает точку зрения левого или правого глаза стерео 360 изображения с соответствующим преобразованием пространства мира. stereoEye до Camera.MonoOrStereoscopicEye.Mono отображает моноскопический вид Scene. После отображения отдельных левого и правого кубических карт, вы можете преобразовать их в эквипрямоугольные панорамные изображения, которые занимают одну текстуру.
При отображении обеих сторон стереоскопического изображения камера использует свой stereoSeparation значение в качестве расстояния между зрачками (IPD), если не включена поддержка VR. При использовании камеры VR устройство VR IPD переопределяет stereoSeparation значение.
Unity использует позицию Camera, очистку флагов и расстояние до плоскости обрезки для рендеринга в кубические лица. Камера поворачивается для каждого лица. 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); } } }