2015-08-20 71 views
3

从我通过阅读文档了解到的情况来看,3D纹理只有1个切片。当我尝试虽然将数据加载到它,它失败,错误:将数据加载到Metal中的3D纹理中

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]; 

其中elementsInRow128,地区是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区域加载数据?

UPDATE 1:

第二个例子的工作原理在区域具有深度1和更大widthheight(但32x32x1它会崩溃)。

更新2:

如果我使用16x16x1,并在该地区的每个像素相同的值写入,它似乎工作,但是当我将数据导出为一个图像,它看起来就像是随机的数据被写入而是看到图像的这种缩放后的部分:

enter image description here

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

回答

2

就是这样。我试图从边界内存中读取,因为参数bytesPerRowbytesPerImage不正确。

文档说:

bytesPerRow
For an ordinary or packed pixel format, the stride, in bytes, between rows of source data.

bytesPerImage
The stride, in bytes, between images in the source data.

我经过思考,他们提到了质地,而不是区域值。

因此,代码应该是:

[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]; 

你永远无法阅读文档不够仔细。