在金属中初始化 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
我有一个用单通道浮点图像初始化的缓冲区,我需要将其转换为浮点格式纹理 (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