根据我阅读文档的理解,3D 纹理只有 1 个切片。但是,当我尝试将数据加载到其中时,它会失败并出现错误:
MTLTexture.m:504: failed assertion `imageBytes(0) must be >= (2048).'
用于加载的代码是(纹理是类型MTLPixelFormatRG16Uint
和大小elementsInRow * elementsInRow * elementsInRow
):
[texture replaceRegion:region mipmapLevel:0 withBytes:data bytesPerRow:sizeof(uint16_t) * 2 * elementsInRow];
其中elementsInRow
是128
,区域是MTLRegion region = MTLRegionMake3D(50, 50, 50, 4, 4, 4);
,数据是uint16_t data[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];
但它会导致内存错误。
另请参阅:https ://forums.developer.apple.com/message/43332#43332
如何正确加载 3D 纹理的 3D 区域中的数据?
更新 1:
第二个示例在区域具有深度1
甚至更大width
并且height
(但32x32x1
会崩溃)时有效。
更新 2:
如果我16x16x1
为区域中的每个像素使用并写入相同的值,它似乎可以工作,但是当我将数据导出为图像时,看起来正在写入随机数据,请参阅图像的缩放部分:
如果我再次运行测试,图像将具有相同颜色的相同顶部,但其余点会改变强度。请注意,我正在为每个像素写入相同的值,因此该区域应该是统一的颜色。