在金属中初始化 MTLPixelFormatR32Float 的纹理

Initialising texture of MTLPixelFormatR32Float in metal

我有一个用单通道浮点图像初始化的缓冲区,我需要将其转换为浮点格式纹理 (MTLPixelFormatR32Float)。我已经尝试使用该格式创建纹理并执行以下操作:

float *rawData = (float*)malloc(sizeof(float) * img.cols * img.rows);

for(int i = 0; i < img.rows; i++){
  for(int j = 0; j < img.cols; j++){
     rawData[i * img.cols + j] = img.at<float>(i, j);
     }
 }

MTLTextureDescriptor *textureDescriptor = [MTLTextureDescriptor texture2DDescriptorWithPixelFormat:MTLPixelFormatR32Float
                                                                                                 width:img.cols
                                                                                                height:img.rows
                                                                                             mipmapped:NO];

[texture replaceRegion:region mipmapLevel:0 withBytes:&rawData bytesPerRow:bytesPerRow];

其中 rawData 是我的缓冲区,其中包含必要的浮点数据。这不起作用,我在 [texture replaceRegion...] 行收到 EXC_BAD_ACCESS 错误。我也试过 MTKTextureLoader,它也是 returns nil 而不是纹理。

帮助将不胜感激。如果有人知道如何使用自定义浮点数据初始化 MTLPixelFormatR32Float 纹理以进行数据并行计算,我将不胜感激。

您传递给 replaceRegion 的字节应该指向您的数据。您错误地将指针传递给了指针。 要修复它,请将 withBytes:&rawData 替换为 withBytes:rawData