在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];
}
您可以(坦率地说,应该)修改和改进它以满足您的需要。
我正在玩 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];
}
您可以(坦率地说,应该)修改和改进它以满足您的需要。