gpt4 book ai didi

ios - 将数据加载到 Metal 中的 3D 纹理中

转载 作者:行者123 更新时间:2023-12-01 18:13:18 28 4
gpt4 key购买 nike

根据我阅读文档的理解,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,region 为 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 以及更大的 宽度高度(但使用 32x32x1 > 它会崩溃)。

更新2:

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

enter image description here

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

最佳答案

就是这样。我试图从边界内存之外读取数据,因为 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];

您永远无法足够仔细地阅读文档。

关于ios - 将数据加载到 Metal 中的 3D 纹理中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32109032/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com