代码之家  ›  专栏  ›  技术社区  ›  halileohalilei

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

  •  0
  • halileohalilei  · 技术社区  · 6 年前

    AREnvironmentProbeAnchor 添加到场景中的 environmentTexture 是一个 MTLTexture ,并表示将用作环境映射的实际多维数据集映射。当我从快速查看这个纹理时,我看到每个方向有6个不同的图像,但是这在内存中是如何表示的呢?如何分别访问每个图像并将其用于任何用途?

    我要做的就是通过这个 混合料 为了统一并在反射探头上使用它,但我需要知道这个纹理是如何表示的,以及如何使用它。如有任何相关信息,敬请谅解。

    1 回复  |  直到 6 年前
        1
  •  1
  •   halileohalilei    6 年前

    根据@rickster的建议,我查看了ARKit 2.0unity插件的实现,并成功地使用了 AREnvironmentProbeAnchor.environmentTexture

    MTLTexture 有一个名为 textureType .typeCubeArray 对于返回的纹理 AREnvironmentProbeAnchor.environment纹理 . 这在 混合料 documentation page

    一个 混合料 有一个 texturetype .cubearray型 意思是当你把指针传给 在统一方面,您可以使用它来创建 Cubemap ,然后可以将其用作反射探测器环境纹理。以下是在统一方面的大致情况:

    // 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;
    }
    

    混合料 . 它的返回类型可以是 void* id<MTLTexture> ,两个都很好。这个方法应该放在你的统一桥上,以便它对统一侧可见。

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