Ios 将数据加载到金属中的三维纹理中

Ios 将数据加载到金属中的三维纹理中,ios,textures,metal,Ios,Textures,Metal,根据我阅读文档的理解,一个3D纹理只有一个切片。但是,当我尝试将数据加载到其中时,它失败并出现错误: MTLTexture.m:504: failed assertion `imageBytes(0) must be >= (2048).' 用于加载的代码为(纹理类型为MTLPixelFormatRG16Uint和大小elementsInRow*elementsInRow*elementsInRow): 其中elementsInRow为128,region为MTLRegion regio

根据我阅读文档的理解,一个3D纹理只有一个切片。但是,当我尝试将数据加载到其中时,它失败并出现错误:

MTLTexture.m:504: failed assertion `imageBytes(0) must be >= (2048).'
用于加载的代码为(纹理类型为
MTLPixelFormatRG16Uint
和大小
elementsInRow*elementsInRow*elementsInRow
):

其中
elementsInRow
128
,region为
MTLRegion region=MTLRegionMake3D(50,50,50,4,4)和数据是
uint16\t数据[region.size.depth][region.size.height][region.size.width][2]

我还尝试了:

[texture replaceRegion:region mipmapLevel:0 slice:0 data bytesPerRow:sizeof(uint16_t) * 2 * elementsInRow bytesPerImage:sizeof(uint16_t) * 2 * elementsInRow * elementsInRow];
但它会导致内存错误

另见此处:

如何在3D纹理的3D区域中正确加载数据?

更新1:

第二个示例在区域具有深度
1
和更大的
width
height
时有效(但使用
32x32x1
会崩溃)

更新2:

如果我使用
16x16x1
并为区域中的每个像素写入相同的值,这似乎是可行的,但当我将数据导出为图像时,看起来是在写入随机数据,请参见图像的此缩放部分:


如果我再次运行测试,图像将具有相同的顶部部分,颜色一致,但其余的点将改变强度。请注意,我将相同的值写入每个像素,因此该区域的颜色应该是一致的。

就是这样。我试图从外部内存读取,因为
bytesPerRow
bytesPerImage
参数不正确

文件说:

bytesPerRow
对于普通或压缩像素格式,数据行之间的跨距(以字节为单位)

bytesPerImage
源数据中图像之间的跨距(以字节为单位)

我传递这些值时认为它们是指纹理,而不是区域

因此,代码应该是:

[texture replaceRegion:region mipmapLevel:0 slice:0 data bytesPerRow:sizeof(uint16_t) * 2 * region.size.width bytesPerImage:sizeof(uint16_t) * 2 * region.size.width * region.size.height];
你对文档的阅读永远都不够仔细

[texture replaceRegion:region mipmapLevel:0 slice:0 data bytesPerRow:sizeof(uint16_t) * 2 * region.size.width bytesPerImage:sizeof(uint16_t) * 2 * region.size.width * region.size.height];