我正在尝试设置一些单色纹理。我想使用由单个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或小于零的浮点值初始化纹理,它会限制采样值吗?
答案 0 :(得分:1)
1其他三个组件返回了什么?
我相信它填补了float4(0, 0, 0, 1)
相应组件中缺少的组件。
如果您只对红色部分感兴趣,只需对.r
的结果应用sample()
。即:
float x_sample = x.sample(linear, float2(0.1, 0.2)).r;
2样本是否对像素值进行归一化?
不。对于浮点像素格式,它不会钳位。