Я пытаюсь настроить некоторые одноцветные текстуры.Я хочу использовать текстуру, состоящую из одного 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))
}
Похоже, что sample хочет вернуть float4вместо одного поплавка.Так что возникает ряд вопросов.
1 Что возвращается в трех других компонентах?
Возвращает ли он соседние пиксели или просто помещает все те же значения в другие компоненты.
2 Нормализует ли образецзначения в пикселях?
Если я инициализирую текстуру с плавающими значениями больше 1 или меньше нуля, то зажимает ли она выборочные значения?