在金属中初始化MTLPixelFormatR32Float的纹理

时间:2016-02-18 21:13:14

标签: ios 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,它也返回nil而不是纹理。

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

1 个答案:

答案 0 :(得分:2)

传递给replaceRegion的字节应指向您的数据。您错误地将指针传递给指针。 要解决此问题,请将withBytes:&rawData替换为withBytes:rawData