在Unity中使用ARKit 2.0的AREnvironmentProbeAnchor.environmentTexture生成反射探针

Using ARKit 2.0's AREnvironmentProbeAnchor.environmentTexture in Unity to generate reflection probes

我正在玩 ARKit 2.0 beta。我看到当我启用环境纹理时,添加到场景的 AREnvironmentProbeAnchor 有一个 environmentTexture 字段,它是一个 MTLTexture,代表将要使用的实际立方体贴图作为环境贴图。当我从 Quick View 查看这个纹理时,我看到它每个方向有 6 个不同的图像,但这在内存中是如何表示的?如何分别访问每个图像并将它们用于任何用途?

我想做的是将这个 MTLTexture 传递给 Unity 并在反射探针上使用它,但我需要知道这个纹理是如何表示的以及如何使用它。任何关于此的信息都将不胜感激。

根据@rickster 的建议,我查看了 ARKit 2.0 Unity 插件的实现,并设法在我的 Unity 场景中实际使用 AREnvironmentProbeAnchor.environmentTexture

MTLTexture 有一个名为 textureType 的 属性,它是一个枚举值并且是 .typeCubeArray 由 [=12= 编辑的纹理 return ].这在 MTLTexture documentation page.

上有详尽的解释

A MTLTexture having a texturetype of type .typeCubeArray 意味着当你把指向这个MTLTexture的指针传递给Unity端时,你可以用它来创建Cubemap,然后您可以将其用作反射探针环境纹理。以下是 Unity 方面的大致工作方式:

// You can pass the pointer to your MTLTexture as an IntPtr to the Unity side
[DllImport("__Internal")]
public static extern IntPtr GetEnvironmentTexture();

void AddNewProbe() 
{
    var texturePtr = GetEnvironmentTexture();
    if (texturePtr == IntPtr.Zero)
    {
        continue;
    }

    var cubemap = Cubemap.CreateExternalTexture(0, TextureFormat.R8, false, texturePtr);
    var probeComponent = AddComponent<ReflectionProbe>();
    probeComponent.customBakedTexture = cubemap;
}

而在 iOS 端,您只需要有一个方法,其名称与您在 Unity 端声明的名称相同,return 是指向您的 MTLTexture 的指针。它的 return 类型可以是 void*id<MTLTexture>,它们都可以正常工作。此方法应放在您的 Unity 桥上,以便它对 Unity 端可见。

extern "C" void* GetEnvironmentTexture() {
    AREnvironmentProbeAnchor* anchor = [self updatedEnvironmentProbeAnchor];
    return (__bridge_retained void*) [anchor environmentTexture];
}

您可以(坦率地说,应该)修改和改进它以满足您的需要。