繁体   English   中英

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

[英]Loading data into a 3D texture in Metal

根据我通过阅读文档的理解,3D纹理只有1个切片。 当我尝试将数据加载到其中时,它会失败并显示错误:

MTLTexture.m:504: failed assertion `imageBytes(0) must be >= (2048).'

用于加载的代码是(texture是类型MTLPixelFormatRG16Uint和size 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:

第二个示例适用于区域深度为1widthheight更大的情况(但是32x32x1会崩溃)。

更新2:

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

在此输入图像描述

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

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

文件说:

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

你永远不能仔细阅读文档。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM