Unity 6.3
0 онлайн 70 гостей 3 в системе
Вход

ObjectIdRequest

класс в UnityEngine.Rendering

Выполнено в:UnityEngine.CoreModule

Описание

ObjectId запрос, который может быть использован для определения объекта, соответствующего каждому пикселю. Может быть представлен с помощью либо Camera.SubmitRenderRequest или RenderPipeline.SubmitRenderRequest, и результаты могут быть использованы либо на CPU в C# или на GPU в шейдере.

После подачи этой просьбы о представлении, ObjectIdRequest._result поле будет заполнено, и каждый пиксель в ObjectIdRequest._destination будет содержать 32-битный цвет, который может быть декодирован в 32-битный целый индекс с помощью ObjectIdResult.DecodeIdFromColor. Этот 32-битный индекс можно затем просмотреть в ObjectIdResult._idToObjectMapping для определения объекта, соответствующего каждому пикселю. C# Пример кода ниже демонстрирует, как этот запрос на отображение может быть использован для определения объекта, соответствующего каждому пикселю.

Хотя нет встроенной функции для декодирования объекта ID (индекс в процентах) ObjectIdResult._idToObjectMapping) из цвета на GPU, следующим образом: HLSL Для этой цели можно использовать функцию shader: int decodeObjectIdInShader(float4 color) { return (int)(color.r * 255) + ((int)(color.g * 255) << 8) + ((int)(color.b * 255) << 16) + ((int)(color.a * 255) << 24); }

SRP Совместимость:

  • URP: Поддерживается путем перехода на Встроенную реализацию Render Pipeline при вызове в редакторе.
  • HDRP: Поддерживается путем перехода на Встроенную реализацию Render Pipeline при вызове в редакторе.

Этот запрос рендеринга в настоящее время не поддерживается вне редактора.

Дополнительные ресурсы: Camera.SubmitRenderRequest, RenderPipeline.SubmitRenderRequest, ObjectIdResult.

using UnityEngine;
using UnityEngine;
using UnityEngine.Experimental.Rendering;
using UnityEngine.Rendering;

// Snapshot containing the object at each pixel from the perspective of the camera. // The snapshot is taken when this class is constructed. class ObjectIdSnapshot { Texture2D m_ObjectIdTexture; Object[] m_IdToObjectMapping;

public ObjectIdSnapshot(Camera camera) { var cameraTargetTexture = camera.targetTexture; var renderTexture = new RenderTexture( width: cameraTargetTexture.width, height: cameraTargetTexture.height, colorFormat: GraphicsFormat.R8G8B8A8_UNorm, depthStencilFormat: GraphicsFormat.D32_SFloat);

var objectIdRequest = new ObjectIdRequest(destination: renderTexture); camera.SubmitRenderRequest(objectIdRequest); m_ObjectIdTexture = ConvertTexture(objectIdRequest.destination); m_IdToObjectMapping = objectIdRequest.result.idToObjectMapping; }

public GameObject GetGameObjectAtPixel(int x, int y) { var color = m_ObjectIdTexture.GetPixel(x, y); var id = ObjectIdResult.DecodeIdFromColor(color); var obj = m_IdToObjectMapping[id]; return GetParentGameObject(obj); }

static GameObject GetParentGameObject(Object obj) { if (obj is null) { return null; } if (obj is GameObject gameObject) { return gameObject; } if (obj is MonoBehaviour component) { return component.gameObject; } return null; }

static Texture2D ConvertTexture(RenderTexture renderTexture) { var previousActiveRenderTexture = RenderTexture.active; RenderTexture.active = renderTexture; var cpuTexture = new Texture2D(renderTexture.width, renderTexture.height, renderTexture.graphicsFormat, TextureCreationFlags.None); cpuTexture.ReadPixels(new Rect(0, 0, renderTexture.width, renderTexture.height), 0, 0); cpuTexture.Apply(); RenderTexture.active = previousActiveRenderTexture; return cpuTexture; } }

Свойства

Свойство Описание
destinationRenderTexture для сохранения результата отображения запроса. Цвета в этом файле RenderTexture можно декодировать, чтобы определить объект, который был отображен в каждом пикселе, сначала декодируя цвет в индекс, используя ObjectIdResult.DecodeIdFromColor а затем, посмотрев этот индекс вверх в ObjectIdResult._idToObjectMapping.
faceЦель Cubemap лица для хранения результата отображения.
mipLevelЦель mipLevel для хранения выхода рендеринга.
resultПоле результата, которое заполняется при подаче и завершении запроса на отображение, содержащее ObjectIdResult._idToObjectMapping, необходимое для интерпретации объекта с цветовой кодировкой IDs, отображаемого в ObjectIdRequest._destination RenderTexture.
sliceЦелевой фрагмент для хранения вывода рендеринга.