采样金属中的单色纹理

时间:2019-01-22 21:58:14

标签: metal

我正在尝试设置一些单色纹理。我想使用由单个32位浮点数组成的纹理。然后使用线性采样器对其进行插值。我已经按照如下步骤设置了金属质感描述符。

MTLTextureDescriptor *textureDescriptor = [[MTLTextureDescriptor alloc] init];
textureDescriptor.textureType = MTLTextureType2D;
textureDescriptor.pixelFormat = MTLPixelFormatR32Float;
textureDescriptor.width = width;
textureDescriptor.height = height;
textureDescriptor.depth = 1;
textureDescriptor.mipmapLevelCount = 1;
textureDescriptor.sampleCount = 1;
textureDescriptor.arrayLength = 1;
textureDescriptor.cpuCacheMode = MTLCPUCacheModeWriteCombined;
textureDescriptor.storageMode = MTLStorageModeManaged;
textureDescriptor.allowGPUOptimizedContents = true;
textureDescriptor.usage = MTLTextureUsageShaderRead;

但是我的着色器代码出现编译错误。

kernel text_kernel(texture2d<float, access::sample> x [[texture(0)]]) {
    constexpr sampler linear(coord::normalized,
                             address::clamp_to_edge,
                             filter::linear);
    float x_sample = x.sample(linear, float2(0.1, 0.2)) 
}

似乎样本想返回一个float4而不是单个float。因此,这引发了许多问题。

1其他三个组件返回了什么?

是返回相邻像素还是只是将所有相同的值放到其他组件中。

2样本是否对像素值进行归一化?

如果我使用大于1或小于零的浮点值初始化纹理,它会限制采样值吗?

1 个答案:

答案 0 :(得分:1)

  

1其他三个组件返回了什么?

我相信它填补了float4(0, 0, 0, 1)相应组件中缺少的组件。

如果您只对红色部分感兴趣,只需对.r的结果应用sample()。即:

    float x_sample = x.sample(linear, float2(0.1, 0.2)).r;
  

2样本是否对像素值进行归一化?

不。对于浮点像素格式,它不会钳位。