【问题标题】:Loading data into a 3D texture in Metal在 Metal 中将数据加载到 3D 纹理中
【发布时间】:2023-03-07 03:34:01
【问题描述】:

根据我阅读文档的理解,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];

其中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 区域中的数据?

更新 1:

第二个示例在区域具有深度1 甚至更大widthheight 时有效(但32x32x1 会崩溃)。

更新 2:

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

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

【问题讨论】:

    标签: ios textures metal


    【解决方案1】:

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

    文档说:

    bytesPerRow
    对于普通或打包的像素格式,数据行之间的步幅(以字节为单位)。

    bytesPerImage
    数据中图像之间的步幅(以字节为单位)。

    我在传递值时认为它们被引用到 texture,而不是 region

    所以代码应该是:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-24
      • 1970-01-01
      • 1970-01-01
      • 2019-08-19
      相关资源
      最近更新 更多