【问题标题】:Using ARKit 2.0's AREnvironmentProbeAnchor.environmentTexture in Unity to generate reflection probes在 Unity 中使用 ARKit 2.0 的 AREnvironmentProbeAnchor.environmentTexture 生成反射探针
【发布时间】:2018-08-22 18:14:47
【问题描述】:

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

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

【问题讨论】:

  • Unity 似乎在这个主题上有 some docs

标签: c# ios swift unity3d arkit


【解决方案1】:

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

MTLTexture 有一个名为textureType 的属性,它是一个枚举值,对于AREnvironmentProbeAnchor.environmentTexture 返回的纹理是.typeCubeArray。这在 MTLTexture documentation page 上有详细解释。

具有texturetype 类型为.typeCubeArrayMTLTexture 意味着当您将指向此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 端声明的名称的方法,它返回指向您的 MTLTexture 的指针。它的返回类型可以是void*id&lt;MTLTexture&gt;,它们都可以正常工作。这个方法应该放在你的 Unity 桥上,以便它对 Unity 端可见。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-13
    • 1970-01-01
    • 1970-01-01
    • 2012-05-04
    • 1970-01-01
    • 2012-12-03
    • 2019-02-25
    • 1970-01-01
    相关资源
    最近更新 更多