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