Ios 将数据加载到金属中的三维纹理中
根据我阅读文档的理解,一个3D纹理只有一个切片。但是,当我尝试将数据加载到其中时,它失败并出现错误: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
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];