根据我通过阅读文档的理解,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
并为区域中的每个像素写入相同的值,它似乎可以工作,但是当我将数据导出为图像时,它看起来像正在编写随机数据,请参阅此缩放图像部分:
如果我再次运行测试,图像将具有相同的顶部颜色均匀,但其余的点将改变强度。请注意,我正在为每个像素写入相同的值,因此该区域应该是均匀的颜色。
答案 0 :(得分:2)
就是这样。我试图从边界内存中读取内容,因为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];
您永远不能仔细阅读文档。